首先需要注意的几个坑点 1.每个战舰长度为a且不能相邻 2.不论怎么样,发现的位置至少是1,不可能是0,就算你知道她一定会说miss
本题的思路,参考了别人的思路,用数据结构做,首先我们看,如何计算[x,y] (左右开放)的可以容纳战舰的数量,我们可以将a+1看成一组,在[a,b]段可以插入的情况是(y-x)/(a+1)
然后我们看数据规模2*10^5,差不多nlogn可以。根据上面的公式我们可以知道1-n最多可以容纳多少战舰,为(n+1-0)/(a+1),假如每次要插入z,如果我们找到已经插入的z左边数x和右边的数y,那么我们就可以更新可以容纳战舰的值,公式如下(注意)
number=number−(y−x)/(a+1)+(z−x)/(a+1)−(y−z)/(a+1)然后我们可以用set实现,利用lower_bound和upper_bound找到最小值最大值,注意这里,upper_bound找到的大于z的值,而lower_bound是小于等于z的值!所以找到lower_bound的迭代器需要减减。
直接看代码吧~
#include<bits/stdc++.h> using namespace std; set<int>s1; int qurey[200010]; int main(){ int n,k,m,a; int number; set<int>::iterator it1,it2; scanf("%d%d%d",&n,&k,&a); scanf("%d",&m); for(int i=1;i<=m;i++){ scanf("%d",&qurey[i]); } number=(n+1)/(a+1); s1.insert(0); s1.insert(n+1); for(int i=1;i<=m;i++){ s1.insert(qurey[i]); it1=s1.lower_bound(qurey[i]); it1--; it2=s1.upper_bound(qurey[i]); number=number-((*it2)-(*it1))/(a+1)+((*it2)-qurey[i])/(a+1)+(qurey[i]-(*it1))/(a+1); if(number<k){ cout<<i<<endl; break; } } if(number>=k){ cout<<-1<<endl; } return 0; } /* 5000 1660 2 20 1 100 18 102 300 81 19 25 44 88 1337 4999 1054 1203 91 16 164 914 1419 1487 */