#3234. 「POI2019 R1」Pomniejszenie

题目描述
题解

我们可以考虑第一位 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 np ,并且 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;}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值