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

题目有个要注意的地方 就是 每艘船不能接触

也就是 你要这样安置船  船_船_船_船_船  

显然 如果空间>一只船的长度,则先塞一直船。 然后用 空间-一只船的长度 / (船+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;
}


你可能感兴趣的:(D. One-Dimensional Battle Ships-二分答案-Codeforces Round #Pi (Div. 2))