专栏文章
题解 CF2050D
CF2050D题解参与者 1已保存评论 0
文章操作
快速查看文章及其快照的属性,并进行相关操作。
- 当前评论
- 0 条
- 当前快照
- 1 份
- 快照标识符
- @miqtvcs7
- 此快照首次捕获于
- 2025/12/04 10:39 3 个月前
- 此快照最后确认于
- 2025/12/04 10:39 3 个月前
题意:
给定一个数字串,可以交换相邻两位,但原来靠右的需要 ,随意操作最大化字符串代表的数字。
思路:
显然一个字符向前交换的次数不会超过 。对于一个位置,枚举其后十个值即可,所以复杂度非常的低。
对于一个位置,从后十个字符中找到交换到当前位置后答案最大的情况,并且实施操作即可。容易发现这样贪心一定是最优的。
程序如下:
CPP#include<cstdio>
#include<cmath>
#include<cstring>
#include<algorithm>
using namespace std;
int T,n;
char a[200005];
int main(){
scanf("%d",&T);
while(T--){
scanf("%s",a+1);
n=strlen(a+1);
for(int i=1;i<=n;i++){
int curmx=0,curpos=i;
for(int j=i;j<=i+10&&j<=n;j++){
if(a[j]-'0'-(j-i)>curmx){
curmx=a[j]-'0'-(j-i);
curpos=j;
}
}
for(int j=curpos;j>i;j--){
swap(a[j],a[j-1]);
a[j-1]--;
}
}
for(int i=1;i<=n;i++)printf("%c",a[i]);
puts("");
}
return 0;
}
THE END
相关推荐
评论
共 0 条评论,欢迎与作者交流。
正在加载评论...