题目描述
FJ 有 N (1 <= N <= 50,000)头牛,FJ的草地可以认为是一条直线。 每只牛只喜欢在某个特定的范围内吃草。第i头牛喜欢在区间(S_i, E_i)吃草, (1 <= S_i < E_i; S_i < E_i<= 100,000,000).
奶牛们都很自私,他们不喜欢和其他奶牛共享自己喜欢吃草的领域,因此FJ要保证任意两头牛都不会共享他们喜欢吃草的领域。如果奶牛i和奶牛j想要同时吃草,那么要满足: S_i >= E_j 或者 E_i <= S_j. FJ想知道在同一时刻,最多可以有多少头奶牛同时吃草?
下面的样例有5头奶牛:
这5头奶牛的范围分别是:(2, 4), (1, 12), (4, 5), (7, 10) (7, 8)。 显然,第1、3、4,共3只奶牛可以同时吃草,第1、3、5也可以。
输入格式
- 第 1 行:一个整数: N
- 第2..N+1行: 第i+1 行有两个整数: S_i 、 E_i
输出格式
*一行: 一个整数,最多可以有多少头牛同时吃草.
输入样例:5
2 4
1 12
4 5
7 10
7 8
输出样例:
3
解题思路:运用贪心的策略,先用结构体储存起点和终点,再根据终点(右端点)排序(因为起点排序可能会导致奶牛活动的重叠),之后一头头地进行比较。
代码如下:
#include<bits/stdc++.h>
using namespace std;
struct cow{
int start;
int end;
}a[50010];
bool mycmp(cow x,cow y)
{
return x.end<y.end;//终点(右端点)排序
}
int main()
{
int n,ans=1,dd;//dd是当前奶牛活动区域的终点 ans最小是一头牛
cin>>n;
for(int i=1;i<=n;i++)
cin>>a[i].start>>a[i].end;
sort(a+1,a+1+n,mycmp);
dd=a[1].end;//初始化
for(int i=2;i<=n;i++)
{
if(a[i].start>=dd)// 如果下一头奶牛的活动区域起点大于当前奶牛活动区域的终点,说明可以同时吃草
{
dd=a[i].end;//换牛继续循环
ans++;
}
}
cout<<ans<<endl;
return 0;
}