题目链接:
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;
}

本文介绍了一个使用二分思想解决的问题——炮弹射击。通过统计炮弹发射前后可容纳船只数量的变化来判断是否减少了船只的总数,并以此决定是否继续发射炮弹。
&spm=1001.2101.3001.5002&articleId=48953273&d=1&t=3&u=f598fe56b0dc4a7a81cfb6fa219f4bc5)
1141

被折叠的 条评论
为什么被折叠?



