#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;}

 

上一篇:html+mp3功能的简单实现


下一篇:文件系统,ntfs ,磁盘配额,卷影副本。本地权限