• #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;}
  • 相关阅读:
    界面布美观布局
    登陆界面验证码设置
    很好的JAVESRIPT控件
    c#导入EXCEL数据
    微软:系列课程 >Silverlight for Windows Phone 开发系列课程
    JavaScript动态网页制作宝库
    Silverlight经典教程书籍汇总
    SQL删除表中有重复的记录
    Javascript鼠标事件
    Android系统架构(转)
  • 原文地址:https://www.cnblogs.com/xjqxjq/p/12435817.html
Copyright © 2020-2023  润新知