题意:两个人玩一维的海战棋,地图大小为1*n,有k艘船,每艘大小为a,船摆放时不能重叠也不能相邻。共打了m发炮弹,问第几发一定能打到船
思路:二分炮弹发数,看地图上剩下的空格长度是否能放下a艘船
#include <iostream>
#include <cstdio>
#include <cmath>
#include <vector>
#include <stack>
#include <cstring>
#include <queue>
#include <algorithm>
#define ll long long
#define max_ 100100
#define les 1e-6
#define inf 0x3f3f3f3f
using namespace std;
int m,n,k,a;
int num[200100];
vector<int>v;
bool check(int x)
{
v.clear();
for(int i=1;i<=x;i++)
v.push_back(num[i]);
v.push_back(n+1);
v.push_back(0);
sort(v.begin(),v.end());
int pre=1,cnt=0;
for(int i=0;i<v.size()-1;i++)
{
cnt+=(v[i+1]-v[i])/(a+1);
}
if(cnt>=k)
return false;
return true;
}
int main(int argc, char const *argv[]) {
scanf("%d%d%d",&n,&k,&a);
scanf("%d",&m);
for(int i=1;i<=m;i++)
scanf("%d",&num[i]);
int l=1,r=m,ans=inf;
while(l<=r)
{
int mid=(l+r)>>1;
if(check(mid))
{
r=mid-1;
ans=mid;
}
else
l=mid+1;
}
if(ans==inf)
printf("-1\n" );
else
printf("%d\n",ans );
return 0;
}