版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/qq_42391248/article/details/84920542
这道题好难啊!
第一次做这种类型的题,不知道从何下手,上网看了很多博客,还是看不懂啊,不过确实有一些帮助,这是一道区间问题。把题目转换一下来做:
长度为n的线段,现在要分成若干区间,每添加一个断点就求一次区间可以被分成多少个以d为长度的小区间。
例如实例1来说
样例1 11 3 3 5 4 8 6 1 11
n=11,d=4(因为战舰不能接触,所以要+1)
插入断点4,区间被分为两份,区间本来可以分为(11+1)/(3+1)=3,加入断点后还是可以分成3。那么把区间看成4到12在加入断点8,依次类推然后判断。(根据:断点可能会让一个区间本来能分若干个d的数量减少:来进行判断)
#include<iostream>
#include<algorithm>
#include<set>
#include<cmath>
using namespace std;
int main()
{
int i,n,k,d,q;
cin>>n>>k>>d>>q;
set<int> s;
set<int>::iterator it;
s.insert(0);
s.insert(n+1);
int sum=(n+1)/(d+1);
int flag=0,ans;
for(i=0;i<q;i++)
{
int t;
cin>>t;
if(flag) continue;
it=s.lower_bound(t);
int r=*it,l=*(--it);
int x=(r-t)/(d+1)+(t-l)/(d+1);
sum+=x-(r-l)/(d+1);
s.insert(t);
if(sum<k)
{
flag=1;
ans=i+1;
}
}
if(flag) cout<<ans<<endl;
else cout<<-1<<endl;
return 0;
}