Codeforces Round #598 (Div. 3), problem: © Platforms Jumping
题目大意
给你一段长度为n的二进制码 然后给你k次操作 使得字符串的字典序最小
题解
一开始考虑是让1移动 后面想了想既然是贪心的话 我们要逆向思维 直接移动0方便多了不是?
注意细节,我存储0的数组是从下标0开始的 因为第一个0最终位置就是0 第二个0的最终位置就是1 第三个是2 依次类推。。。
其实我们没必要进行交换操作,只需要确定最后这个0在哪里 然后直接赋值即可
#include<iostream>
#include<vector>
using namespace std;
typedef long long ll;
ll t,n,k;
string s;
vector<ll> vec;
int main(){
ios::sync_with_stdio(false);
cin.tie(0);
cin>>t;
while(t--){
vec.clear();
cin>>n>>k;
cin>>s;
for(int i=0;i<s.length();i++){
if(s[i]=='0')
vec.push_back(i);
}
for(int i=0;i<vec.size()&&k;i++){
int mov=vec[i];
if(k>=(mov-i)){
//cout<<"mov="<<mov-i<<endl;
k-=(mov-i);
s[mov]='1',s[i]='0';
}
else{
//cout<<"k="<<k<<endl;
s[mov]='1',s[mov-k]='0';
k=0;
}
}
cout<<s<<endl;
}
return 0;
}
学如逆水行舟,不进则退