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