(二分+贪心)玄关!!!WA on test #51求调
  • 板块CF847E Packmen
  • 楼主manbaOUT
  • 当前回复0
  • 已保存回复0
  • 发布时间2025/8/4 12:18
  • 上次更新2025/8/4 17:43:42
查看原帖
(二分+贪心)玄关!!!WA on test #51求调
797769
manbaOUT楼主2025/8/4 12:18

计划从左到右和从右到左扫两遍,但是没过

#include <iostream>
#include <vector>
#define int long long
using namespace std;
char c[100005];
vector<int> ren,bj;
int n,id,l=0,r=2e9;
bool check(int x){
    int cur=ren[0],pt=0;
    /*if(ren[0]>bj[0])cur=ren[0]+x-2*(ren[0]-bj[0]);
    else cur=ren[0]+x;*/
    for(int i=0;i<ren.size();i++){
        if(ren[i]>bj[pt]){
            if(ren[i]-bj[pt]>x)break;
            cur=max(ren[i],ren[i]+x-2*(ren[i]-bj[pt]));
        }
        else cur=ren[i]+x;
        while(cur>=bj[pt]&&pt<bj.size())pt++;//这个人吃掉的包装
    }
    if(pt==bj.size())return true;
    cur=ren[ren.size()-1],pt=bj.size()-1;
    for(int i=ren.size()-1;i>=0;i--){
        if(ren[i]<bj[pt]){
            if(bj[pt]-ren[i]>x)break;
            cur=min(ren[i],ren[i]-x+2*(bj[pt]-ren[i]));
        }
        else cur=ren[i]-x;
        while(cur<=bj[pt]&&pt>=0)pt--;//这个人吃掉的包装
    }
    if(pt==-1)return true;
    return false;
}
signed main(){
    cin>>n;
    for(int i=1;i<=n;i++){
        cin>>c[i];
        if(c[i]=='P')ren.push_back(i);
        if(c[i]=='*')bj.push_back(i);
    }
    while(l<r){
        //cout<<54188<<endl;
        int mid=l+(r-l)/2;
        if(check(mid))r=mid;
        else l=mid+1;
    }
    cout<<l;
    return 0;
}

2025/8/4 12:18
加载中...