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;
}
posted @ 2025-05-10 10:46  Marinaco  阅读(15)  评论(0)    收藏  举报
//雪花飘落效果