CF1409D题解

思路

因为数据较大,使用字符串读入。

考虑使用贪心。

先统计出当前数码之和。然后从低位往高位枚举,看一下把当前位改了之后是否小于等于 \(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;
}

posted @ 2024-01-15 22:20  Xu_dh  阅读(26)  评论(0)    收藏  举报