http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemCode=3985
题意:T组 n 和 一个n长度只含C、P的字符串 其中可以买 C 或 P 插入 买的代价是:第i次买 代价是(i - 1)
然后最后有多少CCPC 设有k个 ans = k - 代价和 求ans的最大值
不限买数 随便插位置 是不是很没思路
可以发现
第 i 次 1 2 3 4 5
代价 0 1 2 3 4
CCPC
(C)CPC C(C)PC CC(P)C CCP(C)
有CPC CCC CCP 这三种特征 可以插 从而 可以构成CCPC
可以得出结论:最多只需 插一个字符
因为你插一个字符 理想结果就 构成多了一个CCPC
不会存在 只插一个字符 能构成 一个以上 CCPC CCP(C)CPC 比如插入括号C 本身就有一个CCPC
又因为代价 可以猜到一些出题思路:插一个 最好构成多一个CCPC 第1次 代价0 我肯定是赚的
而第2次买 字符 就没得赚 还亏
现在问题就是:先看有多少个CCPC 设cnt个 然后再看有没有上面的三个特征 有则cnt + 1
然而并没有那么简单:这种插入字符什么的 要想想插入后会不会影响原来的
CPC 非CCPC 就+1
CCC 注意 插在了中间CC(P)C 所以如果CCCPC 就破坏了一个CCPC 所以如果这样就不要插了 否则+1
CCP 非CCPC 否则+1
#include <iostream>
#include <string>
#include <cstdio>
using namespace std;
int main() {
int t;
scanf("%d", &t);
while (t--) {
int n, cnt = 0;
int done = 0;
string str;
cin >> n >> str;
for (int i = 0; i < str.size(); ++i) {
if (str.substr(i, 4) == "CCPC") {
cnt++;
i += 2;
continue;//i加了2调到P 然后for的自增去到i 下次就从那个C开始
}
if (!done) {
string tmp = str.substr(i, 3);
if (tmp == "CCC" || tmp == "CPC" || tmp == "CCP") {
if (tmp == "CCC" && str.substr(i + 1, 4) == "CCPC") {//CCCPC这种
continue;
}
cnt++;
done = 1;
}
}
}
printf("%d\n", cnt);
}
return 0;
}