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;
}