2022浙江工业大学程序设计迎新赛——预赛 B题 MS 翻硬币

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值