题目意思:很好理解
思路:
当来一发炮弹时,把区间分割,看当炮弹打来后能容下多少的船,
num 是 炮弹打来前能容纳的船的数目
求出炮弹打到的区间的能容纳的船的个数,s1
再求出炮弹打过来,分割的两个区间能容纳船的数目 s2
那莫现在的可容纳的船的数目 是num-s1+s2,然后和k比较
PS:
要想找到炮弹打到位置的前驱和后继,要用到set,set是有序的插入和删除的时间复杂度低,去寻找前驱后继简单
要事先存入0和n+1,范围,然后把船的宽度加1,因为两艘船的之间要相聚1个位置
CODE
#include <iostream>
#include <algorithm>
#include <cstdio>
#include <cstring>
#include <cstdlib>
#include <set>
#define maxn 200010
using namespace std;
set<int>::iterator it1,it2;
int ls[maxn];
int main()
{
int n, k, a;
while(~scanf("%d%d%d",&n,&k,&a))
{
int i, j;
int m;
a++;
scanf("%d",&m);
for(i = 0; i < m; i++)
{
scanf("%d",&ls[i]);
}
set<int> A;
A.insert(0);
A.insert(n+1);
int num = (n+1)/a;
for(i = 0; i < m; i++)
{
it1 = A.upper_bound(ls[i]);
it2 = it1--;
A.insert(ls[i]);
num -= (*it2 - *it1)/a;
num +=(*it2 - ls[i])/a;
num +=(ls[i] - *it1)/a;
if(num < k)
{
printf("%d\n",i+1);
break;
}
}
if(i >= m)
{
printf("-1\n");
}
}
return 0;
}