zoukankan      html  css  js  c++  java
  • 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;
    }
  • 相关阅读:
    [iOS 多线程 & 网络
    [iOS 多线程 & 网络
    [iOS 多线程 & 网络
    [iOS 多线程 & 网络
    [iOS 多线程 & 网络
    [iOS UI进阶
    Python基础
    24种编程语言的Hello World程序
    python中的输入和输出
    第一个Python程序
  • 原文地址:https://www.cnblogs.com/smartljy/p/13470236.html
Copyright © 2011-2022 走看看