51Nod1521 一维战舰(区间问题)

版权声明:本文为博主原创文章,未经博主允许不得转载。 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;
} 

猜你喜欢

转载自blog.csdn.net/qq_42391248/article/details/84920542