#3234. 「POI2019 R1」Pomniejszenie
作者:互联网
题解
我们可以考虑第一位 $p$ 使得 $a[p]<b[p]$ 的需要满足什么条件,故前面不等的个数和加上第 $p$ 位 $a[p] \ge b[p]$ 的和 $\le k$ ,且加上 $n-p$ ,并且 $a[p]<b[p]$ 且 $a[p]$ 可以更小的话再加上 $1$ ,总和要 $\ge k$ 。于是我们可以找到最大的满足条件的 $p$ ,然后把前面改成相等,后面的不是 $9$ 的改成 $9$ ,如果没到个数的话那就从后往前把原来是 $9$ 的改成 $8$ 即可。
代码
#include <bits/stdc++.h> using namespace std; const int N=1e5+5; int T,k,n,a[N],b[N],c[N]; char A[N],B[N]; void work(){ scanf("%s%s%d",A,B,&k); n=strlen(A);int p=-1,v=0; for (int i=0;i<n;i++) a[i]=A[i]^48,b[i]=B[i]^48; for (int u,i=0;i<n;i++){ if (b[i]){ u=v+(a[i]>=b[i]); if (u<=k && u+n-i-1+(a[i]<b[i]&&b[i]>1)>=k) p=i; } v+=(a[i]!=b[i]); } if (p<0){puts("-1");return;}v=0; for (int i=0;i<p;i++) v+=(a[i]!=b[i]),a[i]=b[i]; if (a[p]>=b[p]) a[p]=b[p]-1,v++; else if (v<k && a[p]!=b[p]-1) a[p]=b[p]-1,v++; for (int i=p+1;i<n;i++) if (a[i]<9 && v<k) a[i]=9,v++; for (int i=n-1;i>p;i--) if (A[i]=='9' && v<k) a[i]=8,v++; while(v<k) v++,a[p]--; for (int i=0;i<n;i++) putchar(a[i]^48);puts(""); } int main(){for (scanf("%d",&T);T--;work());return 0;}
标签:POI2019,R1,3234,int,题解,u1,char,1e5,s% 来源: https://www.cnblogs.com/xjqxjq/p/12435817.html