思路
因为数据较大,使用字符串读入。
考虑使用贪心。
先统计出当前数码之和。然后从低位往高位枚举,看一下把当前位改了之后是否小于等于 \(s\)。如果小于的话,则统计出把当前位往后所有位都改为 0,\(k\) 为多少,求出的 \(k\) 就是最优解。
说明一下为什么要从低位往高位枚举,这样如果成功改好,那么答案一定是最小的。
注意:
-
进位的地方可能有些麻烦,可以根据个人写法改变。
-
注意判断前导 0。
AC CODE
#include<bits/stdc++.h>
using namespace std;
int n;
vector<int>ans;
signed main(){
int T;
cin>>T;
while(T--){
string s;
long long f=0;
cin>>s>>f;
long long sum=0;
for(int i=0;i<s.size();i++){
sum+=s[i]-'0';
}
if(sum<=f){
cout<<0<<endl;
continue;
}
for(int i=s.size()-1;i>=0;i--){
if(s[i]=='0')continue;
sum-=(s[i]-'0');
if(sum+1<=f){
int tmp=9;
if(s[s.size()-1]!='0')ans.push_back(10-(s[s.size()-1]-'0'));
else ans.push_back(0),tmp=10;
for(int j=s.size()-2;j>=i;j--){
if(s[j]=='0'&&tmp==10)ans.push_back(0),tmp=10;
else ans.push_back(tmp-(s[j]-'0')),tmp=9;
}
break;
}
}
bool ok=1;
reverse(ans.begin(),ans.end());
for(auto x:ans){
if(x==0&&ok)continue;
cout<<x;
ok=0;
}
cout<<endl;
ans.clear();
}
return 0;
}
标签:tmp,--,题解,sum,long,int,ans,CF1409D
From: https://www.cnblogs.com/xdh2012/p/17966542