poj 2376

题目描述:有N头牛要擦长度为len的地板(起始位置从1开始),给你每头牛能够擦地板的区间,要求,地板必须全被擦到,求出最少需要几头牛可以完成任务。如果不能使所有的地板都被擦到则输出-1.

   解题思路:贪婪算法。

设每头牛擦地板的区间为xi-yi,则先按照xi从小到达排序,如果xi的值相同,则按照yi的值从大到小排列,显然如果x1>1,则输出-1.因为1-2的地板没有牛可以擦。设上述输入的地板区间为结构体data假设开始时牛能擦到的地板区间为[begin,end],则令begin=end=data[0].y,则end按照如下进行更新,end=(data[i].y)(data[i].x-1<=begin&&data[i].y>end)

具体代码如下:

 

#include <iostream>
#include <algorithm>
using namespace  std;

struct point
{
	int x,y;
}data[25002];

int cmp(const point &a,const point &b)                          
{
	if(a.x!=b.x)
		return a.x<b.x;
	return a.y>b.y;
}

int main()
{
	int n,t,i;
	cin>>n>>t;
	for (i=0;i<n;i++)
		cin>>data[i].x>>data[i].y;
	sort(data,data+n,cmp);
	if (data[0].x==1)
	{
		if(data[0].y>=t)
		{
			cout<<1<<endl;
			return 0;
		}
		int j=0;
		int begin,end;
		int ans=1;
		begin=end=data[0].y;
		bool find=0;
		while (!find)
		{
			for (i=j+1;i<n;i++)
			{
				if (data[i].x-1<=end&&data[i].y>end)
				{
					j=i;
					end=data[i].y;
				}
			}
			if (begin==end)
				break;
			if(end>=t)
				find=1;
				ans++;
			begin=end;
		}
		if(find)
			cout<<ans<<endl;
		else
			cout<<-1<<endl;
	} 
	else
		cout<<-1<<endl;
	system("pause");
	return 0;
}

 

你可能感兴趣的:(poj)