CF598 div3 D. Binary String Minimizing(贪心)

CF598 div3 D. Binary String Minimizing(贪心)

在这里插入图片描述
在这里插入图片描述
题目意思:给定一串长度为n的01序列,然后可以有k次交换操作,操作就是可以交换相邻的两个数字,同一位置可以交换多次。问能得到的最小字典序的序列长啥样。
解题思路:还是贪心求解,记录了每个0出现的位子,然后看在现有的可操作数下,能不能把他调到上一个0的后面,如果不能,就把现有次数用完就结束了,最后打印一下。然后时间复杂度是O(n)
太惨了,一开始tle了,然后越改过的越少,改改还改错了。
在这里插入图片描述
最后看一下我写的乱七八糟的解法把:

#include <bits/stdc++.h>

using namespace std;
char a[1000000+10];
int b[1000000+10];
int c[1000000+10];
long long k;
int n;
int q;
int main()
{
    
    
    scanf("%d",&q);
    while(q--){
    
    
        cin>>n>>k;
       memset(a,0,sizeof(a));
       scanf("%s",a);
        int cnt=0;
        b[0]=-1;
        for(int i=0;i<n;++i)
            if(a[i]=='0'){
    
    
                cnt++;
                b[cnt]=i;
            }
        for(int i=1;i<=cnt;++i){
    
    
            int tt=b[i];
            if(k>b[i]-b[i-1]-1){
    
    
                b[i]=b[i-1]+1;
                k-=(tt-b[i]);
                a[tt]='1';//在判断0的前移的时候更改了a的内容 然后一定要先改1再改2 不然如果那个0没动的话就很尴尬会出错。
                a[b[i]]='0';

            }
            else{
    
    
                b[i]-=k;
                a[tt]='1';
                a[b[i]]='0';

                break;
            }
        }
        printf("%s",a);
        printf("\n");
      }
    return 0;
}

猜你喜欢

转载自blog.csdn.net/weixin_43329358/article/details/102995356