您的位置:首页 > 编程语言 > C语言/C++

zoj&CCPC秦皇岛站E-思维-String of CCPC

2017-10-29 19:29 393 查看
http://acm.zju.edu.cn/onlinejudge/showContestProblem.do?problemId=5615

wa了好多次。

给定一个字符串,由c和p组成,可以添加c或者p。

串中出现一个ccpc 价值+1(ccpc可以出现部分重叠),但是如果添加x个字母,那么花费为x-1。问你 价值-花费 的总价值 最大。

最多总价值可以比原来串中的ccpc数目增加1,因为只有第一个字母不要钱,其他字母即使生成一个ccpc,花费也会随应的增加1。

只有一种情况可以再增加1个字母的时候生成两个,那就是再ccpcpc 的第三个字母后面,但是考虑到这个串初始就有1个,所以增加量还是1.

思路:先找ccpc,然后把中间的两个用其他符号替换掉,然后在查找

这三种 ccp cpc ccc。因为这三个增加一个 即可得到一个ccpc。

我开始是把找到的ccpc从串中删除。。这样显然不对还会tle。。erase的时间复杂度O(n)。。

后面就一直寻找 ccp cpc ccc这三个串(还要不和原始的ccpc重叠),搞了好久。。 最后枚举这5种情况。

ccpp pcpc ccccp ccccc cccpp 还有这三个串在 两端的情况。。还是一直wa。

只要把中间的给弄掉就好了qwq

#include <bits/stdc++.h>
using namespace std;
vector<char>s;
int main()
{  int t,m;
char cha;
scanf("%d",&t);
while(t--){
s.clear();
cin>>m;
for(int i=0;i<m;i++){
cin>>cha;
s.push_back(cha);
}
int sum=0;
int ans;
for(int i=0;i<m;i++){
if(i+3<m&&s[i]=='C'&&s[i+1]=='C'&&s[i+2]=='P'&&s[i+3]=='C')
{sum++;
s[i+1]='%';
s[i+2]='%';
}
}
ans=sum;
for(int i=0;i<m;i++){
if(i+2<m&&s[i]=='C'&&s[i+1]=='C'&&s[i+2]=='P')
ans++;
if(i+2<m&&s[i]=='C'&&s[i+1]=='C'&&s[i+2]=='C')
ans++;
if(i+2<m&&s[i]=='C'&&s[i+1]=='P'&&s[i+2]=='C')
ans++;
}

printf("%d\n",ans);
}

return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  c语言