CodeForces 632B Alice, Bob, Two Teams

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/weixin_39645344/article/details/83048305

参考链接 https://blog.csdn.net/WYK1823376647/article/details/52279846

题意:有n个物品,每个物品有一个分值,然后每个物品有一个标牌,如果标牌上是A,那么就属于A,是B,那么就属于B。现在你可以选择一个前缀或者后缀,然后将上面的A改成B,将B改成A,然后问你最多B能够得到多少

思路:分别记录前缀和..

题意:给定n个数和一个字符串,每个数对应一个字符,A表示属于Alice,B表示属于Bob。Bob可以选出字符串的前缀 或者 一个后缀来翻转,A -> B, B -> A,只能使用一次。问Bob可以获得的最大值。(所有属于Bob的数之和)。

思路:维护每一位的前缀和 和 后缀和,最后再是不翻转的情况。


 

#include <cstdio>
#include <queue>
#include <cstring>
#include <iostream>
#include <cstdlib>
#include <algorithm>
#include <vector>
#include <map>
#include <string>
#include <set>
#include <ctime>
#include <cmath>
#include <cctype>
using namespace std;
const int maxn=5e5+10;
#define LL long long
int cas=1,T;
int n;
LL p[maxn];
char s[maxn];
LL sum1[maxn],sum2[maxn];
int main()
{
	scanf("%d",&n);
	for (int i = 1;i<=n;i++)
		scanf("%d",&p[i]);
	scanf("%s",s+1);
	for (int i = 1;i<=n;i++)
	{
		sum1[i]=sum1[i-1];
		sum2[i]=sum2[i-1];
		if (s[i]=='A')
			sum1[i]+=p[i];
		else
			sum2[i]+=p[i];
	}
	LL ans = max(sum1[n],sum2[n]);
	for (int i = 1;i<=n;i++)
	{
		ans = max(ans,sum2[n]-sum2[i]+sum1[i]);
		ans = max(ans,sum2[i]+sum1[n]-sum1[i]);
	}
	cout << ans << endl;
	//freopen("in","r",stdin);
	//scanf("%d",&T);
	//printf("time=%.3lf",(double)clock()/CLOCKS_PER_SEC);
	return 0;
}

猜你喜欢

转载自blog.csdn.net/weixin_39645344/article/details/83048305