【题意】
输入n,代表有n个数,然后再输入n个力量,在输入长度为n的字符串(字符串只包括A或
B),Bob 能够选择该字符串的某一前缀或者后缀,或者什么也不做,将其反转(如果是
A,则变成B,如果是B 则变成A),最后Bob的力量是所有B对应的力量和。输出最大的力
量和!
【解题思路】
因为是前缀或者后缀,所以直接扫描终点即可!然后区间内的把A的力量加起来,区间外的
把B的力量加起来,比较最大值即可!
【AC代码】
#include <bits/stdc++.h>
using namespace std;
#define CLE(a,b) memset(a,b,sizeof(a))
#define MEC(a,b) memcpy(a,b,sizeof(a))
#define ll long long
using namespace std;
const int nn = 500010;
int a[nn];
char s[nn];
ll sum1[nn],sum2[nn];
int main()
{
int n;
cin>>n;
for(int i=1; i<=n; i++)cin>>a[i];
scanf("%s",s+1);
CLE(sum1,0);
CLE(sum2,0);
for(int i=1; i<=n; i++)
{
sum1[i] = 0,sum2[i] = 0;
sum1[i] += sum1[i-1],sum2[i] += sum2[i-1];
if(s[i]=='A')sum1[i] += a[i];
else sum2[i] += a[i];
}
ll ans = -1;
ll len = n;
ll tsum = 0;
for(int i=1; i<=n; i++)//change prefix.
{
tsum = sum1[i] + sum2[len] - sum2[i];
ans = max(ans,tsum);
}
for(int i=len; i>0; i--)//change suffix.
{
tsum = sum2[i] + sum1[len] - sum1[i];
ans = max(ans,tsum);
}
cout<<ans<<endl;
return 0;
}
本文介绍了一道算法题目——最大力量和问题的解决方法。题目要求通过选择字符串的前缀或后缀并进行反转来获得最大的力量和。文章详细阐述了解题思路,并提供了完整的AC代码实现。
1313

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



