Codeforces Round #570 (Div. 3)

博客介绍了四道算法题的解题思路。包括求离给定数最近且各位数和能被4整除的数;求使各数与某数差值在给定范围的最大数;在游戏中使第一种方式次数最大且剩余电量大于0;以及让加入糖果每种个数不同的问题。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

A. Nearest Interesting Number

就是要求离所给的数最近的所有位数的和能被4整除的数,那么直接从所给的数开始,然后一个一个求就可以了,复杂度不高,不会T;

# include <bits/stdc++.h>
using namespace std;

int main()
{
    int a;

    scanf("%d",&a);

    for(int i=a;;i++){
        int aa=i;
        int b=0;
        while(aa){
            int c=aa%10;
            b+=c;
            aa=aa/10;
        }
        if(b%4==0){
            printf("%d",i);
            break;

        }
    }

    return 0;
}

B. Equalize Prices

求出最大的一个数,而且要使得每一个数和这个数的差都在给定的范围内,那么就可以用这个范围的值,求出每一个数能够接受的范围,然后交起来就可以了,如果交起来为空的话,那么说明没有这样的数存在

# include <bits/stdc++.h>
using namespace std;

int a[110];
int main()
{
    int Q;
    scanf("%d",&Q);

    while(Q--){
        int n,k;
        scanf("%d %d",&n,&k);
        int l[110],r[110];
        int ml,mr;
        for(int i=1;i<=n;i++){
            scanf("%d",&a[i]);
            l[i]=a[i]-k;
            if(i==1){
                ml=l[1];
            }else{
                ml=max(ml,l[i]);
            }
            r[i]=a[i]+k;
            if(i==1){
                mr=r[1];
            }else{
                mr=min(mr,r[i]);
            }
        }
        if(mr>=ml){
            printf("%d\n",mr);
        }else{
            printf("-1\n");
        }
    }

    return 0;
}

C. Computer Game

要求使用两种方式完成每一轮的游戏,然后要求最后剩下的电量大于0,并且要求第一种方式的次数要最大。那么就相当于一个不等式(ax+by)<k && x+y=n 可得 x<( k- bn) / (a-b)对于每一次求出来的x向下取整,然后在和轮数比较就可以
或者是 x<=(k-1-b
n)/(a-b)直接整除然后和轮数比较

# include <bits/stdc++.h>
using namespace std;

typedef long long LL; 
int main()
{
    int T;
    scanf("%d",&T);
 
    while(T--){
        LL k,n,a,b;
        scanf("%lld %lld %lld %lld",&k,&n,&a,&b);
        double cnt=0.0;
        cnt=((k-b*n)*1.0)/((a-b)*1.0);
        //printf("@@@@ %lf\n",cnt);
        if(cnt<=0.0){
            //printf("@@@ ");
            printf("-1\n");
        }else{
            LL ccnt;
            cnt=cnt-1;
            ccnt=min((long long)ceil(cnt),n);
            //printf("%d\n",(int)ceil(cnt));
            //printf("@@@ ");
            printf("%lld\n",ccnt);
        }
    }
 
    return 0;
}

# include <bits/stdc++.h>
using namespace std;

typedef long long LL;
int main()
{
    int T;
    scanf("%d",&T);

    while(T--){
        LL k,n,a,b;
        scanf("%lld %lld %lld %lld",&k,&n,&a,&b);
        if(k<=b*n){
            printf("-1\n");
        }else{
            LL sum=0;
            sum=(k-1-b*n)/(a-b);
            printf("%lld\n",min(sum,n));
        }
    }

    return 0;
}

D. Candy Box (easy version)

要求加入的糖果的每一种的个数都不相同,那么就是先把每一种的糖果的个数都记录下来,然后排序,分两种情况讨论,如果后一个比前一个选择的大或者相等,那么再次加上的是比前一个小1的数,如果后一个比前一个选择的小,那么再次奸商的就是该数,如果当前的数已经小于等于0,那么就可以结束。

    # include <bits/stdc++.h>
    using namespace std;

    const int MAXN=2e5+10;
    int a[MAXN];
    int cmp(int a,int b)
    {
        return a>b;
    }
    int main()
    {
        int T;
        scanf("%d",&T);

        while(T--){
            int n;
            scanf("%d",&n);
            for(int i=1;i<=n;i++){
                int b;
                scanf("%d",&b);
                //printf("@%d %d\n",b,a[b]);
                a[b]++;
            }
            sort(a+1,a+n+1,cmp);
            int sum=0;
            int aa=a[1];
            sum+=a[1];
            //printf("%d ",a[1]);
            //printf("%d ",aa);
            for(int i=2;i<=n;i++){
                //printf("%d ",a[i]);
                if(a[i]>=aa){
                    aa=aa-1;
                    if(aa>0) sum+=aa;
                    else break;
                }else{
                    aa=a[i];
                    sum+=aa;
                }
                //printf("%d ",aa);
            }

            //int sum=0;

            printf("%d\n",sum);
            for(int i=1;i<=n;i++) a[i]=0;
        }


        return 0;
    }

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值