链接:http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemCode=3985
BaoBao has just found a string
To make this string more valuable, BaoBao decides to buy some characters from a character store. Each time he can buy one 'C' or one 'P' from the store, and insert the character into any position in
The final value BaoBao obtains is the final value of
Input
There are multiple test cases. The first line of the input contains an integer
The first line contains an integer
The second line contains the string
It's guaranteed that the sum of
Output
For each test case output one line containing one integer, indicating the maximum final value BaoBao can obtain.
Sample Input
3
3
CCC
5
CCCCP
4
CPCP
Sample Output
1
1
1
Hint
For the first sample test case, BaoBao can buy one 'P' (cost 0 value) and change
For the second sample test case, BaoBao can buy one 'C' and one 'P' (cost 0 + 1 = 1 value) and change
For the third sample test case, BaoBao can buy one 'C' (cost 0 value) and change
It's easy to prove that no strategies of buying and inserting characters can achieve a better result for the sample test cases.
题意:
在一个字符串中可以多次添加C,P,每i次添加需要减去价值(i-1),求最大的价值
分析:
暴力,一个for循环,很简单,但是前后缀和我给弄混了,wrong了8发
代码:
#include<bits/stdc++.h>
#define ll long long
#define inf 0x3f3f3f3f
using namespace std;
const int maxn=200010;
int n,m,k;
int a[maxn],sumq[maxn],sumh[maxn];
int c[maxn];
int ans,ct,cnt,tmp,flag;
char s[maxn];
int main()
{
int T,cas=1;
scanf("%d",&T);
while(T--)
{
scanf("%d",&n);
ans=0; flag=1;
scanf("%s",s);
int l=strlen(s);
sumq[0]=0;
sumh[l]=0;
for(int i=0;i<l;i++){
if(i) sumq[i]=sumq[i-1];
if(i-3>=0&&s[i-3]=='C'&&s[i-2]=='C'&&s[i-1]=='P'&&s[i]=='C')
{
sumq[i]++;
}
}
for(int i=l-1;i>=0;i--)
{
sumh[i]=sumh[i+1];
if(i+3>=l)continue;
if(s[i]=='C'&&s[i+1]=='C'&&s[i+2]=='P'&&s[i+3]=='C')
{
sumh[i]++;
}
}
ans=max(sumq[l-1],sumh[0]);
for(int i=0;i<l;i++)
{
if(s[i]=='C'&&s[i+1]=='P'&&s[i+2]=='C'&&i+2<l)
{
if(i==0) ans=max(ans,sumh[i]+1);
else ans=max(ans,sumq[i-1]+sumh[i]+1);
continue;
}
if(s[i-2]=='C'&&s[i-1]=='C'&&s[i]=='C'&&i>=2)
{
if(i==2) ans=max(ans,sumh[i]+1);
else ans=max(ans,sumq[i-1]+sumh[i]+1);
continue;
}
if(s[i-1]=='C'&&s[i]=='P'&&s[i+1]=='C'&&i+1<l&&i-1>=0)
{
if(i==0) ans=max(ans,sumh[i]+1);
else ans=max(ans,sumq[i-1]+sumh[i]+1);
continue;
}
if(s[i-2]=='C'&&s[i-1]=='C'&&s[i]=='P'&&i>=2)
{
if(i==2) ans=max(ans,sumh[i]+1);
else
ans=max(ans,sumq[i]+sumh[i+1]+1);
continue;
}
}
printf("%d\n",ans);
}
return 0;
}
本文解析了ZJU ACM竞赛题3985的解题思路,通过优化的前后缀和算法,在字符串中插入字符以最大化价值。详细介绍了代码实现过程,包括初始化、循环计算及最终输出。

被折叠的 条评论
为什么被折叠?



