CodeForces 632 B.Alice, Bob, Two Teams(水~)

Description
有n个物品,分为A和B两种,每个物品有一个价值pi,Bob可以把任意一个前缀或者后缀中所有A物品变成B物品,B物品变成A物品,之后Bob拿到所有B物品,问Bob能拿到的物品的最大价值
Input
第一行一整数n表示物品数量,之后n个整数pi表示第i个物品的价值,最后一个长度为n的字符串表示每个物品的种类(1<=n<=5e5,1<=pi<=1e9)
Output
输出Bob能拿到物品的最大价值
Sample Input
5
1 2 3 4 5
ABABA
Sample Output
11
Solution
分别维护A物品和B物品价值的前缀和和后缀和,pa[i]和pb[i]分别表示前i个物品中A和B物品的价值和,sa[i]和sb[i]分别表示第i个物品到第n个物品中A和B物品的价值和,那么ans=max(max(pa[i]+sb[i+1]),max(pb[i]+sa[i+1]))
Code

#include<cstdio>
#include<iostream>
#include<cstring>
#include<algorithm>
#include<cmath>
#include<vector>
#include<queue>
#include<map>
#include<set>
#include<ctime>
using namespace std;
typedef long long ll;
#define INF 0x3f3f3f3f
#define maxn 555555
int n,p[maxn];
ll pa[maxn],pb[maxn],sa[maxn],sb[maxn];
char s[maxn];
int main()
{
    while(~scanf("%d",&n))
    {
        for(int i=1;i<=n;i++)scanf("%d",&p[i]);
        scanf("%s",s+1);
        pa[0]=p[0]=0;
        for(int i=1;i<=n;i++)
        {
            pa[i]=pa[i-1],pb[i]=pb[i-1];
            if(s[i]=='A')pa[i]+=p[i];
            else pb[i]+=p[i];
        }
        sa[n+1]=sb[n+1]=0;
        for(int i=n;i>=1;i--)
        {
            sa[i]=sa[i+1],sb[i]=sb[i+1];
            if(s[i]=='A')sa[i]+=p[i];
            else sb[i]+=p[i];
        }
        ll ans=pb[n];
        for(int i=0;i<=n;i++)ans=max(ans,pa[i]+sb[i+1]);
        for(int i=n;i>=1;i--)ans=max(ans,pb[i-1]+sa[i]);
        printf("%I64d\n",ans);
    }
    return 0;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值