Codeforces 1256D Binary String Minimizing

思路:

1.每输入进来一个0,看它是否能移动到最前端(前面不存在字符‘1’即为最前端),计算所需要的移动次数,和k做比较;
2.k够用就输出一个0;不够的话计算最多能移动到哪,输出相应数量的1,再输出这个0,再输出剩下的1,然后既然k用完了,接下来输入什么就输出什么;
3.输入输出的数据量较多,可以考虑优化一下cin和cout,或者直接用scanf和getchar;

代码:

#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
#define rp(i,n) for(int i=0;i<n;i++)
#define rpn(i,n) for(int i=1;i<=n;i++)
const int MAX_N=1000005;
int main(){
	int q;
	scanf("%d",&q);
	rp(i,q){
		ll n,k;
		scanf("%lld %lld",&n,&k);
		getchar();
		ll ans=0;//统计当前0的个数 
		bool flag=false;//k是否被用完 
		rp(j,n){
			char c=getchar();
			if(flag) putchar(c);
			else if(c=='0'){
				ll d=j-ans;//移到最前面所需要的次数 
				if(k<=d){//k被用完了,不够0被移到最前面 
					ll pos=j-k;
					for(pos=ans;pos<j-k;pos++) putchar('1');
					putchar('0');
					for(pos++;pos<j+1;pos++) putchar('1');
					flag=true;					
				}else putchar('0');	//k足够此次的0被移到最前端					
				ans++;
				k-=d; 
			}
		}	
		if(k>0) for(int pos=ans;pos<n;pos++) putchar('1');//k没有被用完 
		putchar('
');
	}
	return 0;
}
原文地址:https://www.cnblogs.com/yuhan-blog/p/12308903.html