Codeforces Round #Pi (Div. 2)-D. One-Dimensional Battle Ships (set+二分)

题意:给一个1*n的网格,有k个1*a的船,船之间不能重叠,也不能接触。现有m个询问,每个询问给出一个位置i,代表切割玩个中的第i个。问第几个询问开始,网格已经不能放下k个船

思路:二分能切割的次数

        set+二分,每次询问,插入当前位置,并与相邻的两个位置更新下,看能放的船是否变少了  

/*
二分/set
思路:二分次数/set+二分,每次询问,更新能放的船数是否变少
*/
#include <bits/stdc++.h>
using namespace std;

const int MAXN = 2e5+5;
set<int> s;
int n,m,k,a,b,ans;

int main(){
    cin>>n>>k>>a;
    s.clear();
    cin>>m;
    int flag=0;
    s.insert(0);
    s.insert(n+1);
    ans=(n+1)/(a+1);
    for (int i=1; i<=m; i++){
        cin>>b;
        if (flag==0){
            int c=*s.lower_bound(b);
            int d=*--s.lower_bound(b);
            s.insert(b);
            ans-=(c-d)/(a+1);
            ans+=(c-b)/(a+1)+(b-d)/(a+1);
            if (ans<k) flag=i;
        }
    }   
    if (flag) cout<<flag<<endl;
    else cout<<-1<<endl;

    return 0;
}

猜你喜欢

转载自blog.csdn.net/leave8426/article/details/80052882