Codeforces Round #581 (Div. 2) D-Kirk and a Binary String【思维】

Codeforces Round #581 (Div. 2) D-Kirk and a Binary String【思维】

题目:

http://codeforces.com/contest/1204/problem/D2

参考资料:

https://blog.csdn.net/nudt_spy/article/details/99940916

大致题意:

给你一个S串(01串),让你求出对应长度的T串,T串中任意区间的LIS都和S串一样长,但T串中的0要尽可能地多。

思路:

(这里所说的LIS是允许相邻两个元素相等的。)
每个以0为起点的LIS,改成1的话必然会导致LIS长度减小,所以不改动0。
每个以1字符分两种情况
对于包含他的LIS区间而言,无论改不改,对那些LIS区间都无影响。
但对于不包含他的LIS区间而言,如果他改成了0,会增加LIS的长度。

换句话说,若想将 1 变为 0 ,必须保证后面所有的区间的 LIS 长度必须和 1 的个数相等!!!

所以只要从后往前统计,当0和1的数量相等的时候,才能把这个1改成0。

代码:

#include<iostream>
#include<cstdio>
#include<cstdlib>
#include<string.h>
#include<algorithm>
using namespace std;

int main() {
	char ss[100008];
	scanf("%s",ss);
	int lenss = strlen(ss);
	int cnt = 0;
	for(int i = lenss-1; i >= 0; i--) {
		if(ss[i] == '0') {
			cnt++;
		}
		else if(ss[i] == '1') {
			if(cnt != 0)
				cnt--;
			else
				ss[i] = '0';
		}
	}
	puts(ss);
	return 0;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值