题目描述:有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;
}