CodeForces 632B Alice, Bob, Two Teams
阿新 • • 發佈:2018-11-04
參考連結 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; }