MS 翻硬币
Description
MS 手头有一枚硬币,他觉得不好玩,于是向集训队借了 n-1 枚硬币。
现在他将 n 枚硬币摆成一排,每一枚硬币可能正面朝上,可能反面朝上,所有硬币的初始状态事先给定。
MS 不是很喜欢正面,从左向右数的第 i 枚的硬币如果正面向上,会导致 MS 的不高兴度增加 2^(n−i),如果反面向上则不会增加不高兴度,MS 初始不高兴度为 0。
现在 MS 每次可以选取任意一段连续的硬币然后翻转它们。MS 想知道他在至多 kk 次操作之后得到的硬币序列是什么样的,才能使得 MS 的不高兴度最小。
但是 MS 不想思考了,所以他拿着这个问题来请教你,你需要帮他解决这个问题。
Input
第一行包含两个正整数 n(1≤n≤10^6) 和 k(0≤k≤n),分别表示硬币的总数和可操作的次数的上限。
第二行包含一个长度为 n 的 01 串 s,对于其中的每一位,0 表示硬币反面朝上,1 表示硬币正面朝上。
Output
输出一个 01 串,描述最后得到的硬币序列。
Sample Input 1
6 2 101011
Sample Output 1
000011
Hint
MS 的不高兴度为 2^0 + 2^1 = 3,可以证明,不存在其他能够得到的序列比这个序列更优。
注意一下是翻转一段,而且是越出现在前面越值得翻转
#include<bits/stdc++.h>
using namespace std;
string a;
int main()
{
int n,k;
cin >> n >> k;
cin >> a;
for(int i=0;i<n && k;i++)
{
if(a[i]=='1')
{
k--;
int j=i;
while(a[j]=='1')
{
a[j]='0';
j++;
}
}
}
cout<<a;
return 0;
}