C题:T-shirts
标签:枚举、模拟
题意:给定一个长度为
N
N
N的字符串
S
S
S(只含
0
、
1
、
2
0、1、2
0、1、2),表示具体日程安排。
0
0
0:没有计划;
1
1
1:出去吃饭;
2
2
2:参加竞赛
0
0
0:没有计划的日子,会把所有穿过的T恤洗掉
1
1
1:出去吃饭,可以穿素色T恤或者带
l
o
g
o
logo
logo的T恤
2
2
2:参加竞赛,只能穿带
l
o
g
o
logo
logo的T恤
一开始给定你
M
M
M件素色T恤,求最少要购买几件带
l
o
g
o
logo
logo的T恤才能满足日程安排?
穿过了的 T恤就不能再穿了,除非给它重新洗过了。
(
1
<
=
M
<
=
N
<
=
1000
1<=M<=N<=1000
1<=M<=N<=1000)
题解:发现其实
N
N
N很小,所以我们可以直接从小到大枚举一下需要购买的带
l
o
g
o
logo
logo的 T恤数量,然后跑下字符串
S
S
S的日程,看看是否满足日程安排。因为是从小到大,找到的第一个就可以直接输出了。
题目中有要求,穿过了的 T恤就不能再穿了,除非给它重新洗过了。所以我们在枚举带
l
o
g
o
logo
logo的 T恤数量的过程中,需要维护一下目前还没穿和已经穿过的素色 T恤数量、目前还没穿和已经穿过的带
l
o
g
o
logo
logo的 T恤数量。
以下是针对于具体日程安排的处理逻辑:
0
0
0:没有计划的日子,会把所有穿过的T恤洗掉;这时候把对应已经穿过的加到未穿过的数量上,然后把对应已经穿过的数量置
0
0
0。
1
1
1:出去吃饭,很显然要优先穿素色的T恤,先判这个逻辑;如果没有未穿过的素色T恤,再考虑穿带
l
o
g
o
logo
logo的 T恤,如果带
l
o
g
o
logo
logo的 T恤也没有,那说明现在枚举的购买 T恤数量
k
k
k不够,跳出往后找更大数量。
2
2
2:参加竞赛。和出去吃饭的逻辑差不多,只不过因为只能穿带
l
o
g
o
logo
logo的T恤,所以直接判带
l
o
g
o
logo
logo的情况就好了。
代码:
#include <bits/stdc++.h>
using namespace std;
int main() {
int n, m;
string s;
cin >> n >> m >> s;
// k: 买带logo的T恤 件数
for (int k = 0; k <= n; k++) {
bool f = 1;
int a1 = m, a2 = 0; // plain 没穿过/已经穿过
int b1 = k, b2 = 0; // logo 没穿过/已经穿过
for (int i = 0; i < s.size(); i++) {
if (s[i] == '0') {
a1 += a2; a2 = 0;
b1 += b2; b2 = 0;
}
else if (s[i] == '1') {
if (a1 > 0) a1--, a2++;
else {
if (b1 > 0) b1--, b2++;
else {
f = 0;
break;
}
}
}
else if (s[i] == '2') {
if (b1 > 0) b1--, b2++;
else {
f = 0;
break;
}
}
}
if (f == 1) {
cout << k << endl;
return 0;
}
}
return 0;
}