原题链接: https://codeforces.com/contest/2000/problem/D
题目大意:
上面有一个整数数组,下面有一个字符串,字符串只有 ‘L’ 和 ‘R’ 组成。可以对L~R的位置的数组中进行一次加和,然后对这个字符串L~R的位置变成 ‘*’ 。是一题非常明显的贪心双指针题。
题目理解:
可以定2个变量当双指针,zuo,you。开始时让zuo = 0,you = n-1.然后分别往中间找,要让s[zuo] 是 ‘L’ ,s[you] 是 'R' 的情况下,对这之间的数进行一次求和,然后加到总和num中,一次一次求和肯定是过于繁琐了,所以在输入数组的时候可以对数组进行前缀和的方法处理。那么在后面的求和中可以直接用 a[you] - a[zuo-1] 来算出这个区间的和。
在上代码之前,提示一下本题最大陷阱:
千万不能忘记开long long !!!
在使用前缀和的方法时,最大的数可以达到2e10,这超过了int的范围,如果你使用的是int会在test7得到一个WA
那么上代码:
#include<bits/stdc++.h>
using namespace std;
int t,n,m,k;
char c;
void solve(){
long long num = 0;
string s;
cin>>n;
int zuo=1,you=n;
vector <long long> a(n+1);
for(int i=1;i<=n;i++){
cin>>a[i];
a[i] += a[i-1];
}
cin>>s;
while(zuo < you){
if(s[zuo-1] == 'L' && s[you-1] == 'R'){
num += a[you]-a[zuo-1];
you--;
zuo++;
}
if(s[zuo-1] != 'L') zuo++;
if(s[you-1] != 'R') you--;
}
cout<<num<<endl;
return;
}
int main()
{
ios::sync_with_stdio(false);
cin.tie(0); cout.tie(0);
cin>>t;
while(t--) solve();
return 0;
}