关于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;
}
posted @ 2020-11-07 00:14  Time_Limit_Exceeded  阅读(115)  评论(0编辑  收藏  举报