题解 CF1409D 【Decrease the Sum of Digits】

江户川·萝卜

2020-09-05 12:14:23

Solution

### 题意: 给定n,求一个最小的x,使$n+x$的各位数之和小于等于s。 ### 解法 加着加着各位数之和变小了,我们就想到了进位。 我们就可以:从低位一位一位往高位进位,直到满足条件为止。 原因: - 低位进位需要的代价远比高位进位需要的代价小。 - 假设本来高位加一次需要 $10^k$ ,如果从低位往上进位的话,就用了 $<10^k$ 的代价,而且还让各位数之和更少。 应该是很好理解的。 代码: ```cpp #include<iostream> #include<cstdio> using namespace std; unsigned long long n,ans,r; int t,s,tot; int main(){ scanf("%d",&t); for(int i=1;i<=t;i++){ scanf("%lld%d",&n,&s); tot=ans=0; r=n; while(r){ tot+=r%10; r/=10; }//求出n的各位数之和 if(tot<=s){ printf("0\n"); continue; }//一开始n的各位数之和就小于等于s for(unsigned long long res=1;tot>s&&res<n;res*=10){ int c=n/res%10; if(c==0) continue; ans+=(10-c)*res; n+=(10-c)*res; tot=0; r=n; while(r){ tot+=r%10; r/=10; }//求各位数之和 }//模拟从低位往高位进位 printf("%lld\n",ans); } return 0; } ```