Автор проблеми: | TheSensei |
Підготовлено: | Hasan Saleh (MathModel) |
Редаговано: | Hasan Saleh (MathModel) |
Рішення Наша мета — максимізувати значення виразу, зверніть увагу, що для кожного з s_i=\mathtt{B} він вносить -a_i у вираз, а s_i=\mathtt{S} (Продаж) вносить a_i у суму, отже, ми хочемо максимізувати значення і мінімізувати значення . У нас є точно два випадки:
У нас s_i=\mathtt{B} для всіх або s_i=\mathtt{S} для всіх , що означає, що ми не можемо виконати жодних корисних обмінів, тому ми обчислюємо вираз як є.
У нас обидва і з'являються в , тоді ми хочемо зменшити максимальне значення a_i з s_i=\mathtt{B}, оскільки воно вносить негативне значення. Жадібний підхід полягає в тому, щоб поміняти максимальне значення a_i з s_i=\mathtt{B} з мінімальним значенням a_i з , отже, ми маємо більшу суму, і це найкраще рішення.
#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;
}Складність