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