题目有个要注意的地方 就是 每艘船不能接触
也就是 你要这样安置船 船_船_船_船_船
显然 如果空间>一只船的长度,则先塞一直船。 然后用 空间-一只船的长度 / (船+1) 再加上之前的1 即可得到空间放的船数
二分要注意 l r的判断,注意二分临界点
http://codeforces.com/contest/567/problem/D
//http://codeforces.com/contest/567/problem/D
#include <cstring>
#include <string>
#include <algorithm>
#include <iostream>
#include <queue>
#include <map>
#include <set>
#include <vector>
using namespace std;
int N, K, W, M;
int A[200005];
int B[200005];
int solve(int x)
{
// if (x>=M) return 0;
int ret=0;int i;
for (i=1;i<=x;i++)
B[i]=A[i];
sort(B+1,B+1+x);
if (B[1]-1>=(W))
ret+=1+(B[1]-1-W)/(W+1);
for (i=2;i<=x;i++)
if (B[i]-B[i-1]-1>=(W))
ret+=1+(B[i]-B[i-1]-1-W)/(W+1);
if (N-B[x]>=W)
ret+=1+(N-B[x]-W)/(W+1);
return ret;
}
int main()
{
scanf("%d%d%d", &N, &K, &W);
scanf("%d", &M);
for(int i=1; i<=M; i++)
scanf("%d",&A[i]);
int lo=1, mid, hi=M;
while(lo<=hi)
{
mid=(lo+hi)/2;
int tmp=solve(mid);
int tmp2=solve(mid+1);
if (tmp>=K&&tmp2<K)
{
printf("%d\n", mid+1);
return 0;
}
else
if(tmp<K)
hi=mid-1;
else
lo=mid+1;
}
if (lo<=M)
printf("%d\n", mid); //注意要是mid 考虑到 l=1 r=0// 和l=n+1 r=n
else
printf("-1\n");
return 0;
}