Codeforces Round #262 (Div. 2)总结

17 篇文章 0 订阅

这次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;
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值