题解:P3615 [JOISC 2016] 如厕计划 / Toilets
zhujianheng · · 题解
我们首先显然的,知道一个队列如果是合法的(就是可以在时间内实现出的),则设男生为
首先判无解。总后缀和大于等于
然后如果有解,怎么计算答案?很显然,只要将最后面的男生调整到前面去,使得最大的后缀和也不超过
最后代码很清晰了。
#include <bits/stdc++.h>
using namespace std;
#define int long long
const int N = 100009;
string s[N];
int k[N], n, m, ans, suf[N], mx[N];
signed main() {
cin >> n >> m;
for (int i = 1; i <= m; i++)
cin >> s[i] >> k[i];
int x = 0;
for (int i = m; i; i--) {
for (int j = s[i].size() - 1; ~j; j--) {
if (s[i][j] == 'M')
suf[i]++;
else
suf[i]--;
mx[i] = max(mx[i], suf[i]);
}
x += suf[i] * k[i];
}
if (x > 0) {
cout << -1 << '\n';
return 0;
}
int ans = 0;
x = 0;
for (int i = m; i; i--) {
ans = max(ans, max(x + mx[i], x + (k[i] - 1) * suf[i] + mx[i]));
x += suf[i] * k[i];
}
cout << (ans?ans - 1:0) << endl;
return 0;
}