CF632B
思路
这一题还是比较简单的,可以使用贪心算法解决,有一个数组 $p$ 又来积分,由于是要找最大能量,所以可以先遍历一下前缀,再遍历一下后缀,看哪个能量更多,先求一下本来可以获得的能量,分别放在变量 $a$ 和 $b$ 中,比较 $a$、$b$ 和 $ans$ 就行。
AC Code
#include<iostream>
using namespace std;
const int N=5*1e5+5;
long long p[N],x[N],n,ans;//用x存当前是否能获得能量
int main(){
cin>>n;
for(int i=1;i<=n;i++){
cin>>p[i];
}
for(int i=1;i<=n;i++){
char s;
cin>>s;
if(s=='A'){
x[i]=1;
}
ans+=x[i]*p[i];//如果能获得能量就是1*p[i]=p[i],否则就是0*p[i]=0
}
long long a=ans,b=ans;//分别记录一下
for(int i=1;i<=n;i++){//遍历前缀
if(x[i]==1){
a-=p[i];
}
else{
a+=p[i];
}
ans=max(ans,a);
}
for(int i=n;i>=1;i--){//遍历后缀
if(x[i]==1){
b-=p[i];
}
else{
b+=p[i];
}
ans=max(ans,b);
}
cout<<ans<<endl;
return 0;
}