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