C. Limited Repainting
题目链接:https://codeforces.com/contest/2070/problem/C
题意:
初始数组全为R
一次操作可以指定一段连续的区间为B
给定一个字符串S
若最后相同位置i的数组元素与S[i]不同,则会受到惩罚a[i]
规定 最终受到的惩罚 为这些惩罚的最大值
求最多操作k次,受到的 最小的 最终受到的惩罚
思路:
二分答案
二分 最终受到的惩罚 大小为X,那么我们需要将所有代价大于X的数组都涂正确
所有小于X的数组不用管,那么贪心选取区间
当选取区间小于等于k次,则check成立
int n,k;
string s;
bool check(vector<int>&a,int mid){
int cnt=0;
int flag=0;
for(int j=1;j<=n;j++){
if(s[j]=='B'&&a[j]>mid){
if(!flag){
flag=1;
cnt++;
}
}
if(s[j]=='R'&&a[j]>mid){
flag=0;
}
}
return cnt<=k;
}
void solve(){
cin>>n>>k;
cin>>s;s=" "+s;
vector<int>a(n+1);
rep(i,1,n)cin>>a[i];
int l=0,r=1e18;
int res=0;
while(l<=r){
int mid=l+r>>1;
if(check(a,mid)){
res=mid;
r=mid-1;
}else{
l=mid+1;
}
}
cout<<res<<endl;
}

浙公网安备 33010602011771号