题解:CF2203B Beautiful Numbers
DX3906_ourstar · · 题解
发现只有
显然对于非最高位,我们把它置
于是分两种情况:修改最高位和不修改最高位。对于两种情况,按上述方式求出答案,然后取最小的即可。
代码:
#include<iostream>
#include<vector>
#include<algorithm>
#define int long long
using namespace std;
int T;
int x;
inline int f(int x){
int res=0;
while(x)res+=x%10,x/=10;
return res;
}
inline void work(){
cin>>x;if(f(x)<10)return cout<<0<<"\n",void();
vector<int>a;//存储拆出来的数位
int tmp=x;
int sum=0;while(tmp)a.push_back(tmp%10),sum+=tmp%10,tmp/=10;
reverse(a.begin(),a.end());
sort(a.begin()+1,a.end(),[](int a,int b){return a>b;});
int res1=0;bool f=0;//不修改最高位的情况
int rsum=sum;
for(int i=1;i<a.size();++i){
if(rsum<10)break ;
++res1,rsum-=a[i];
}
int res2=1;rsum=sum,rsum-=a[0],++rsum;//修改最高位的情况
for(int i=1;i<a.size();++i){
if(rsum<10)break ;
++res2,rsum-=a[i];
}
return cout<<min(res1,res2)<<"\n",void();
}
signed main(){
ios::sync_with_stdio(false);cin.tie(0);
cin>>T;while(T--)work();
return 0;
}