Codeforces Round #262 (Div. 2)总结

来源:互联网 发布:log4j sql语句输出 编辑:程序博客网 时间:2024/06/05 16:38

这次B题悲剧了的,多写了if判断,唉。

A题:

       水题一道,直接模拟计算即可。

代码:

#include<cstdio>#include<cstring>#include<iostream>#include<algorithm>using namespace std;int n,m;int main(){    while(scanf("%d%d",&n,&m)!=EOF)    {        int ans=n;        int res=n;        while(res>=m)        {            ans+=res/m;            res=res%m+res/m;        }        printf("%d\n",ans);    }    return 0;}

B题:

如果单从这个题的话最开始无从下手,然后发现其中有个是统计数中各个位数的和,然后就可以枚举这个和(范围就变成了1到81),通过这个枚举可以算出X的值,然后再统计X的各个位上的和是否和最开始的相等,注意判断是否超过范围。比赛的时候我是把范围判断写在前面了,导致部分答案出现问题,唉~

代码:

#include<cstdio>#include<cstring>#include<iostream>#include<algorithm>using namespace std;const int maxi=1e9;long long a,b,c,ans[500];int cnt;int GetSum(long long val){    int ans=0;    while(val)    {        ans+=val%10;        val/=10;    }    return ans;}int main(){    while(scanf("%I64d%I64d%I64d",&a,&b,&c)!=EOF)    {        cnt=0;        for(int i=0;i<=81;i++)        {            long long val=1;            for(int j=0;j<a;j++)                val*=i;            val=val*b;            val=val+c;            if(val>=maxi)                continue;            if(val<=0)                continue;            if(GetSum(val)==i)                ans[cnt++]=val;        }        sort(ans,ans+cnt);        printf("%d\n",cnt);        for(int i=0;i<cnt;i++)        {            if(ans[i]<=0)                continue;            printf("%I64d%c",ans[i],i==cnt-1?'\n':' ');        }    }    return 0;}

C题:

这个题可以用二分答案做,受前天做多校某题的启发,加上看到数据范围,所以确定了二分的思路。

代码:

#include<cstdio>#include<cstring>#include<iostream>#include<algorithm>using namespace std;const int inf=1<<30;const int maxn=2e5+100;int n,m,w,a[maxn];int tot[maxn];bool check(int val){    memset(tot,0,sizeof(tot));    int now=0,res=m;    for(int i=1;i<=n;i++)    {        now+=tot[i];        if(a[i]+now<val)        {            res-=val-a[i]-now;            if(res<0)                return false;            tot[i+w]-=val-a[i]-now;            now+=val-a[i]-now;        }    }    return true;}int main(){    while(scanf("%d%d%d",&n,&m,&w)!=EOF)    {        memset(tot,0,sizeof(tot));        int l=0,r=inf;        for(int i=1;i<=n;i++)        {            scanf("%d",&a[i]);            r=max(a[i],r);        }        int ans=0;        while(l<=r)        {            int mid=(l+r)>>1;            if(check(mid))            {                ans=mid;                l=mid+1;            }            else                r=mid-1;        }        printf("%d\n",ans);    }    return 0;}


0 0