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;
}
posted @ 2023-08-07 12:50  very_easy  阅读(10)  评论(0)    收藏  举报  来源