题目描述
题解
我们可以考虑第一位 p p p 使得 a [ p ] < b [ p ] a[p]<b[p] a[p]<b[p] 的需要满足什么条件,故前面不等的个数和加上第 p p p 位 a [ p ] ≥ b [ p ] a[p] \ge b[p] a[p]≥b[p] 的和 ≤ k \le k ≤k ,且加上 n − p n-p n−p ,并且 a [ p ] < b [ p ] a[p]<b[p] a[p]<b[p] 且 a [ p ] a[p] a[p] 可以更小的话再加上 1 1 1 ,总和要 ≥ k \ge k ≥k 。于是我们可以找到最大的满足条件的 p p p ,然后把前面改成相等,后面的不是 9 9 9 的改成 9 9 9 ,如果没到个数的话那就从后往前把原来是 9 9 9 的改成 8 8 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;}