CF1204D2 Kirk and a Binary String (hard version)
形式化题意
给你一个长为
策略分析
题中给的数据范围是
对于只有
- 如果当前位为
,那么后面无论 都是不降的; - 如果当前位为
,那么后面为 才是不降的。
那么我们是不是很容易发现本题的构造原则:一个
1 | 0 1 1 1 1 1 0 0 0 |
为了方便读者观看,这个串下面的数字是其下标。我们以下标为 1 1 1 1 1,这一位改成 0 1 1 1 1,不管怎么变长度都不会变,因为其后 1 1 1 变成了
0 0 0 0,不符合我们的构造条件。
出现这种情况的原因是,对于当前位来讲,它的最长不降子序列只能是一堆
在写代码的时候,我们可以把维护个数改成维护
参考代码
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
using namespace std;
namespace SHAWN {
string s;
int cnt;
int work()
{
cin >> s;
for (int i = s.size() - 1; i >= 0; --i) {
if (s[i] == '0') { ++cnt; }
else if (s[i] == '1' && cnt <= 0) { s[i] = '0'; }
else { --cnt; }
}
cout << s << '\n';
return 0;
}
}
signed int main() {
ios :: sync_with_stdio(false);
cin.tie(nullptr);
return SHAWN :: work();
}