Logo 快乐的熊果的博客

博客

12月算法比赛题解(不全)

2024-12-23 22:06:21 By 快乐的熊果

前言:没写完,只写了前面几个水题……

A题:很简单,输入+算各位和+排序+输出,全员AC

代码:

#include<bits/stdc++.h>
using namespace std;
int main(){
    int n;
    cin>>n;
    int a[n+1];
    int t;
    int sum;
    for(int i=1;i<=n;i++){
        cin>>t;
        sum=0;
        while(t>0){
            sum+=t%10;
            t/=10;
        }
        a[i]=sum;
    }
    sort(a+1,a+n+1);
    for(int i=1;i<=n;i++){
        cout<<a[i]<<' ';
    }
    return 0;
}

B题:因为只有一副对联不全,所以排序之后查找。如果一副对联是全的,那么它应该与他后面的尺寸相等(i=i+1),如果不一致就是缺(好像有点难懂)

代码:

#include<bits/stdc++.h>
using namespace std;
int main(){
    int n;
    cin>>n;
    int a[n+1];
    for(int i=1;i<=n;i++){
        scanf("%d",&a[i]);
    }
    sort(a+1,a+n+1);
    for(int i=1;i<=n;i+=2){
        if(a[i]!=a[i+1]){
            cout<<a[i];
            return 0;
        }
    }
    return 0;
}

C题,有难度,但是不多。对结束时间进行排序,如果一个节目的开始时间晚于或等于上一个观看节目的结束时间(a[x].si>=a[i].ei),就可以看(似乎也有点难懂)

代码:

#include <bits/stdc++.h>
using namespace std;
struct node{
    int si,ei;
}a[208201];
bool cmp(node x,node y){
    return x.ei<y.ei;
}
bool vis[208201];
int sum=1;
int m;
bool pd(int x){
    for(int i=x-1;i>=1;i--){
        if(vis[i]){
            if(a[x].si>=a[i].ei){
                return true;
            }
            else{
                return false;
            }
        }
    }
}
int main(){
    cin>>m;
    for(int i=1;i<=m;i++){
        cin>>a[i].si>>a[i].ei;
    }
    sort(a+1,a+m+1,cmp);
    vis[1]=true;
    for(int i=2;i<=m;i++){
        if(pd(i)){
            sum++;
            vis[i]=true;
        }
    }
    cout<<sum;
    return 0;
}

E题:这道题有难度,正解应该用二分答案(当然你用歪门邪道也是可以过去的),这里只讲二分。

先说思路:从1~1e9(1000000000)之间二分,如果这个时间可以使每个集装箱风干,我们就移动右指针(r=mid-1)看看时间能否更短,反之就移动左指针(l=mid+1)

那么如何判断时间是否够呢?要分三种情况

1.可以自然风干:不必管他

2.用吸尘器清理Xs后正好可以清除:time+=(box[i]-midXa)/b;(X是乘号)

3.用吸尘器清理Xs后还需要再清一次:time+=(box[i]-midXa)/b+1;

然后把所花费的时间加起来然后判断就可以了

还有一点很重要:开LONG LONG(不开会0分)

代码:

#include<bits/stdc++.h>
using namespace std;
long long n,a,b;
int box[10000001];
bool check(long long mid){
    long long time=0;
    for(int i=1;i<=n;i++){
        if(box[i]<=mid*a){
            continue;
        }
        else{
            if((box[i]-mid*a)%b==0){
                time+=(box[i]-mid*a)/b;
            }
            else{
                time+=(box[i]-mid*a)/b+1;
            }
        }
    }
    return time<=mid;
}
int main(){
    cin>>n>>a>>b;
    for(int i=1;i<=n;i++){
        cin>>box[i];
    }
    long long l=1,r=1e9,mid,ans;
    while(l<=r){
        mid=(l+r)/2;
        if(check(mid)){
            ans=mid;
            r=mid-1;
        }
        else{
            l=mid+1;
        }
    }
    cout<<ans;
    return 0;
}

G题:一道数论题,让我们看看怎么推出来的

step 1:a^2-b^2=(a+b)(a-b)=>a+b与a-b奇偶性相同

step 2:所以(a+b)(a-b)要么是奇数,要么是4的倍数

step 3:couple number要么是奇数,要么是4的倍数

代码:

#include<bits/stdc++.h>
using namespace std;
int main(){
    int n1,n2,sum=0;
    cin>>n1>>n2;
    for(int i=n1;i<=n2;i++){
        if(i%4==0||i%2!=0){
            sum++;
        }
    }
    cout<<sum;
    return 0;
}

评论

乙鸟
手动点赞
豆豆超人
[厉害]
豆豆超人
ด้้้้้็้้้็็็็็้้้้้็็็็็้้้้้้็็็็็้้้้้็็็็็้้้้้้็็็็็้้้้้็็็็็้้้้้้็็็็็้้้้้็็็็็้้้้ด้้้้้็้้้็็็็็้้้้้็็็็็้้้้้้็็็็็้้้้้็็็็็้้้้้้็็็็็้้้้้็็็็็้้้้้้็็็็็้้้้้็็็็็้้้้ด้้้้้็้้้็็็็็้้้้้็็็็็้้้้้้็็็็็้้้้้็็็็็้้้้้้็็็็็้้้้้็็็็็้้้้้้็็็็็้้้้้็็็็็้้้้

发表评论

可以用@mike来提到mike这个用户,mike会被高亮显示。如果你真的想打“@”这个字符,请用“@@”。