D. Binary String Minimizing(贪心*1500)

传送门的传说决赛

\(贪心的想尽可能把前面的1变成0\)

\(那我们记录每个0的位置,每次遇到1就和后面最近的一个0交换\)

\(怎么交换?冒泡排序?我们发现我们要交换的1和0间都是1\)

\(所以直接swap()交换就行了,效果一样\)

\(注意k开long\ long\)

#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
string s;
int a[1000009],top,n;	ll k;
int main()
{
	int t;
	cin>>t;
	while(t--)
	{
		cin>>n>>k>>s;
		top=0;
		for(int i=0,l=s.length();i<l;i++)
		if(s[i]=='0')	a[++top]=i;
		int last=1;
		for(int i=0,l=s.length();i<l;i++)//开始模拟
		{
			if(s[i]=='0')	last++;
			else//'1'要和后面的0交换 
			{
				if(last>top)	continue;
				if(a[last]-i>k)	continue;
				swap(s[a[last]],s[i]);
				k-=(a[last]-i),last++;
			}	
		}
		cout<<s<<endl; 
	}
}

猜你喜欢

转载自www.cnblogs.com/iss-ue/p/12893567.html
今日推荐