Live2d Test Env

HihoCoder1672 : 区间问题([Offer收割]编程练习赛41)(贪心)

时间限制:10000ms
单点时限:1000ms
内存限制:256MB

描述

给定N个区间[Ai, Bi],请你找到包含元素最少的整数集合S,使得每个区间都至少有两个整数在S中。  

例如给定三个区间[1, 3], [1, 4], [2, 5],则S={2, 3}。

输入

第一行包含一个整数N。

以下N行每行包含两个整数Ai, Bi。  

对于30%的数据,1 ≤ N ≤ 1000  

对于100%的数据, 1 ≤ N ≤ 100000 1 ≤ Ai < Bi ≤ 1000000

输出

输出一个整数代表S的大小。

样例输入
3  
1 3 
1 4  
2 5  
样例输出
2
  • 模型:借教室。 

 

  • 手段:贪心,按第二关键词或者第一关键字(应该可以)。

 

#include<cstdio>
#include<cstdlib>
#include<iostream>
#include<algorithm>
#include<cstring>
using namespace std;
const int maxn=2000010;
struct in { int a; int b; } x[maxn];
bool cmp(in x,in y) {  if(x.b==y.b) return x.a>y.a;  return x.b<y.b;}
int main()
{
    int ans=0,n,i,j,laxt=0,pre=0;
    scanf("%d",&n);
    for(i=1;i<=n;i++) scanf("%d%d",&x[i].a,&x[i].b);
    sort(x+1,x+n+1,cmp);
    for(i=1;i<=n;i++){
        if(pre>=x[i].a) continue;
        else if(laxt>=x[i].a) ans++,pre=laxt,laxt=x[i].b;
        else ans+=2,laxt=x[i].b,pre=laxt-1;      
    }
    printf("%d\n",ans);
    return 0;
}

 

posted @ 2017-12-24 19:17  nimphy  阅读(459)  评论(0编辑  收藏  举报