题意:给一个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; }