YbtOj练习:贪心3 最优密码

这道题暴力拿了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;
}
原文地址:https://www.cnblogs.com/smartljy/p/13470236.html