关于11.1 ZUST校CCCC选拔赛(L1部分)题目的思路1(自我学习记录用)
思路:看到题目想到暴力枚举,但是不能盲目,因为一看数据必超时
我们可以换一个思路来枚举,例如:
如果n=12345时候,从哪个地方开始枚举?
假设最坏情况,就是每位都是9,那就是从12345-5*9=12300开始枚举
这样复杂度大大减小
最后说一下,不要忘记加上关闭缓冲区语句,否则会超时
#include <bits/stdc++.h>
using namespace std;
int main(){
ios::sync_with_stdio(false),cin.tie(0),cout.tie(0);//关闭缓冲区
long long n; cin>>n;
long long k=1;
int ws=0;//记录n的位数
while(1){
if(k<=n&&n<k*10){
ws++;
break;
}else{
k*=10;
ws++;
}
}
int cnt=0;
for(long long i=n-9*ws;i<n;i++){
long long sum=0;
long long tmp=i;
long long tmpk=k;
while(tmpk!=0){//计算各位数和
int p; p=tmp/tmpk;
tmp%=tmpk; tmpk/=10;
sum+=p;
}
sum+=i;
if(sum==n)cnt++;
}
cout<<cnt;
return 0;
}