1. 程式人生 > >CodeForces 632B Alice, Bob, Two Teams

CodeForces 632B Alice, Bob, Two Teams

參考連結 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;
}