/*
题意:
在1~n的格子里,有k艘,每艘长为a的船,并且这些船不相交且不能相邻。
现在有m个射击,每个射击给你一个位置(1~n),并且不会重复。
由于对方每次都说没打中,因此你想找到至少要射击几次才能证明对方说谎。
若不能证明对方说谎,输出-1。
思路:
n个格子,船长为a,则能放(n+1)/(a+1)艘船。(由于要求不能相邻,因此a+1)。
每次在set中插入射击点,二分上下界 原来可以放的船数减去因这个点而不能放的与k进行比较
*/
# include<stdio.h>
# include<algorithm>
# include<string.h>
# include<set>
using namespace std;
set<int>s;
set<int>::iterator it1;
set<int>::iterator it2;
int vis[200010];
int num[200010];
int main()
{
int n,k,a,i,m;
while(~scanf("%d%d%d",&n,&k,&a))
{
s.clear();
scanf("%d",&m);
for(i=1; i<=m; i++)
scanf("%d",&num[i]);
int tmp=(n+1)/(a+1);///原来可以放这么多
s.insert(0);//上下边界
s.insert(n+1);
memset(vis,0,sizeof(vis));
for(i=1; i<=m; i++)
{
if(vis[num[i]])
continue;
vis[num[i]]=1;
s.insert(num[i]);
it1=s.lower_bound(num[i]);
it1--;
it2=s.upper_bound(num[i]);
tmp-=((*it2)-(*it1))/(a+1)-((*it2)-num[i])/(a+1)-(num[i]-(*it1))/(a+1);
if(tmp<k)
{
printf("%d\n",i);
break;
}
// printf("%d %d\n",*it1,*it2);
}
if(i>m)
printf("-1\n");
}
return 0;
}
codeforces 567D One-Dimensional Battle Ships (set)
最新推荐文章于 2018-01-28 22:53:44 发布