题目链接:
http://acm.fzu.edu.cn/problem.php?pid=2203
题目大意:
中文题。
思路:
利用二分思想。在刚开始统计最多能放的船数。一个个炮弹插进去,同时统计炮弹两边的空间能放的船,与没有打炮弹之前能放的船做比较,如果能放的船变少了,就将能放的总船数减少,如果能放的船总数小于已有的船只,就break了。
代码:
#include<stdio.h>
#include<string.h>
int main()
{
int n,K,A,i,j,m,x[200005],vis[200005],ok,l,r;
while(scanf("%d%d%d",&n,&K,&A)!=EOF)
{
int as=-1;
scanf("%d",&m);
for(i=1;i<=m;i++)
scanf("%d",&x[i]);
ok=(n+1)/(A+1);
memset(vis,0,sizeof(vis));
vis[0]=1;
vis[n+1]=1;
int d=0,ans1,ans2,ans;
for(i=1;i<=m;i++)
{
vis[x[i]]=1;
for(j=x[i]-1;j>=0;j--)
{
if(vis[j]){
l=j;
d=x[i]-j;
d--;
ans1=(d+1)/(A+1);
break;
}
}
for(j=x[i]+1;j<=n+1;j++)
{
if(vis[j]){
r=j;
d=j-x[i];
d--;
ans2=(d+1)/(A+1);
break;
}
}
ans=(r-l)/(A+1);
ok=ok-(ans-ans1-ans2);
if(ok<K){
as=i;break;
}
}
printf("%d\n",as);
}
return 0;
}