ZOJ-3985 String of CCPC(字串處理)
阿新 • • 發佈:2018-12-13
傳送門:
題意:
給你一個字串,其中只有'C',‘P’兩種字元。現在你可以從商店中購買‘C’,'P'兩種字元,但需要支付費用,第一次購買需要支付0,第二次支付1,第n次支付n-1。現在你可以通過組成CCPC字元來賺取1,每組成一個CCPC字元賺1。其中CCPCCPC這是兩個CCPC。問你最多賺多少錢。
思路:
其實就是要麼不購買,要麼就購買一次。因為購買兩次及以上就只能賠錢。
一共會有三種情況
1.CCC型,這時需要購買一個P,插入到第二個C後。但是還需判斷是不是CCCPC型別,如果是這種情況,那麼就不需購買P了。
2.CPC型,這時需要買一個C,插入到第一個C後。但是需要判斷第一個C的前一位是不是C,如果是C,那麼就不購買。
3.CCP型,這時需要買一個C,插入到P後面,需要判斷P後面是不是C,如果是,就不買。
從頭遍歷一遍就行。
程式碼:
#include<cstdio> #include<iostream> #include<cstring> #include<algorithm> using namespace std; char ch[200005]; bool book[200005]; int n; bool ccc(int i) { if(i + 2 >= n) return false; if(i + 4 < n && ch[i+3] == 'P' && ch[i+4] == 'C') return false; if(ch[i] == 'C' && ch[i+1] == 'C' && ch[i+2] == 'C') return true; return false; } bool cpc(int i) { if(i+2 >= n) return false; if(i-1 >= 0 && ch[i-1] == 'C') return false; if(ch[i] == 'C' && ch[i+1] == 'P' && ch[i+2] == 'C') return true; return false; } bool ccp(int i) { if(i+2 >= n) return false; if(i+3 < n && ch[i+3] == 'C') return false; if(ch[i] == 'C' && ch[i+1] == 'C' && ch[i+2] =='P') return true; return false; } bool ccpc(int i) { if(i+3 >= n) return false; if(ch[i] == 'C' && ch[i+1] == 'C' && ch[i+2] == 'P' && ch[i+3] == 'C') return true; return false; } int main() { int t; cin >> t; while(t--) { scanf("%d%s", &n,ch); int ans = 0; memset(book,1,sizeof(book)); int flag = 0; for(int i = 0; i < n; i++) { if(ccc(i) || cpc(i) || ccp(i)) { flag = 1; } if(ccpc(i)) ans++; } printf("%d\n", ans+flag); } return 0; }