Problem Müəllifi: | TheSensei |
Hazırlayan: | Hasan Saleh (MathModel) |
Redaktə edən: | Hasan Saleh (MathModel) |
Həll Məqsədimiz ifadənin dəyərini maksimuma çatdırmaqdır, qeyd edin ki, s_i=\mathtt{B} olan hər ifadəyə -a_i ilə töhfə verir və s_i=\mathtt{S} (Satış) isə cəmlə a_i ilə töhfə verir, beləliklə, -nin dəyərlərini maksimuma çatdırmaq və -nin dəyərlərini minimuma endirmək istəyirik. Bizim tam iki halımız var:
Bütün üçün s_i=\mathtt{B} və ya bütün üçün s_i=\mathtt{S} var, bu da faydalı dəyişdirmə edə bilməyəcəyimizi bildirir, buna görə ifadəni olduğu kimi hesablayırıq.
Həm , həm də -də görünür, o zaman s_i=\mathtt{B} olan a_i-nin maksimum dəyərini azaltmaq istəyirik, çünki bu, mənfi dəyərə töhfə verir. Açgöz yanaşma, s_i=\mathtt{B} olan maksimum a_i-ni -nin minimum a_i ilə dəyişdirməkdir, beləliklə, daha böyük bir cəmi əldə edirik və bu, ən yaxşı həll yoludur.
#include<bits/stdc++.h>
#define int long long
using namespace std;
void solve(){
int n;cin>>n;
string s;cin>>s;
vector<int>a(n);
for(auto &i:a)cin>>i;
int mx=0;
int mn=1e18;
int idx1=-1,idx2=-1;
for(int i=0;i<n;i++){
if(s[i]=='B'){
if(a[i]>mx){
idx1=i;
mx=a[i];
}
}
if(s[i]=='S'){
if(a[i]<mn){
idx2=i;
mn=a[i];
}
}
}
if(idx1!=-1 && idx2!=-1){
swap(s[idx1],s[idx2]);
}
int ans=0;
for(int i=0;i<n;i++){
if(s[i]=='B'){
ans+=a[i]*-1;
}else{
ans+=a[i];
}
}
cout<<ans<<"\n";
}
signed main(){
int t;cin>>t;
while(t--){
solve();
}
return 0;
}Komplekslik