游荡的奶牛

题目描述

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头奶牛:

pic

这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;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值