这道题暴力拿了90分,正解实在不会写!
因为字符串不好操作,所以干脆把它变成一个int的数组,最后输出时直接把数字转换成字符输出。
首先考虑我们的贪心策略:(下标从1开始),设k为我们已经处理过的位置的个数,初始时k=0。只要我们的操作次数还有剩余,那么就考虑第k+1个位置能通过交换操作得到的最小的数字是多少。
代码如下
#include<bits/stdc++.h> #define R register int using namespace std; const int inf=0x3f3f3f3f; typedef int ll; const int N=100005; char ch[N]; int s[N]; ll m; int k; int main() { scanf("%d%s",&m,ch); int len=strlen(ch); for(R i=0;i<strlen(ch);i++) s[i+1]=ch[i]; while(m>0) { int minn=inf,tmp=0; for(R i=k+1;i<=k+m+1&&i<=len;i++) //m次操作可以把 pos上的数字移动到pos-m处 { if(minn>s[i]) { minn=s[i]; tmp=i; } } for(R i=tmp;i>k+1;i--) { int t=s[i]; s[i]=s[i-1]; s[i-1]=t;//手写交换比swap更快,嘿嘿 } m-=tmp-k-1;k++;//把R位置的数字移动到L位置,需要使用R-L次操作 } for(R i=1;i<=len;i++) putchar(s[i]); return 0; }