String of CCPC ZOJ - 3985【思維 + 規律】

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

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章