CF - 817C. Really Big Numbers

这题是在1到n范围内找满足(设一个数为x,数位之和为sum(x))x-sum(x)>=s的数的个数,根据x满足条件,我们就可以得到x+1也满足条件,因为x+1-sum(x+1)=x+1-(sum(x)+1)=x-sum(x),由x-sum(x)>=s可得x+1-sum(x+1),所以x满足则x+1也满足,可以推广得到一个数满足则其后面的数都满足,因此要找1到n内总的满足条件的数,只需找到第一个满足条件的即可,然后看样例又可以知道数越大满足条件的可能性就越大,因此具有单调性,可以用二分找这个数,0视为不满足,1视为满足,可以看出是这样00001111。。。。

#include<bits/stdc++.h>
using namespace std;
#define ll long long
ll n,s;
bool check(ll x)
{
    ll tmp1=0;
    ll tmp2=x;
    while(x)
    {
        tmp1=tmp1+x%10;
        x/=10;

    }
    if(tmp2-tmp1>=s)
        return true;
    else
        return false;
}
int main()
{
    std::ios::sync_with_stdio(false);
    cin>>n>>s;
    ll low=1,up=n,mid,ans=-1;
    while(low<=up)
    {
        mid=(low+up)>>1;
        if(check(mid))
        {
            ans=mid;
            up=mid-1;
        }
        else
            low=mid+1;
    }
    if(ans==-1)
        cout<<0<<endl;
    else
        cout<<n-ans+1<<endl;
    return 0;
}

 

posted @ 2018-08-11 19:18  eason99  阅读(57)  评论(0编辑  收藏  举报