贪心问题——区间选点

问题描述:

数轴上有 n 个闭区间 [a_i, b_i]。取尽量少的点,使得每个区间内都至少有一个点(不同区间内含的点可以是同一个)

Input

第一行1个整数N(N<=100)
第2~N+1行,每行两个整数a,b(a,b<=100)

Output

一个整数,代表选点的数目

Examples

Input
2
1 5
4 6
Output
1
Input
3
1 3
2 5
4 6
Output
2
View Code

解决思路:

贪心策略:选点之前先要对区间排个序嘛,一共有两种策略

1)左端点升序排序

2)右端点升序排序

贪心总是达到局部最优

我们总是希望每个点可以覆盖到更多的点,即选择未覆盖区间的右端点选择覆盖

如果按照 1)  那么下面这种情况则不会达到最优,舍弃。。

如果按照 2)

ok

 

Code

 1 #include<iostream>
 2 #include<algorithm>
 3 using namespace std;
 4 
 5 typedef struct Node{
 6     int a,b;
 7     
 8 }node;
 9 
10 node *interval=new node[100];
11 bool cmp(node x,node y){
12     if(x.b!=y.b)
13        return x.b<y.b;
14        
15     return x.a>y.a;
16 }
17 
18 //区间选点 
19 /*按照终点从小到大排序
20 int main()
21 {
22     int N;
23     cin>>N;
24     for(int i=0;i<N;i++){
25         cin>>interval[i].a>>interval[i].b;
26     }
27     
28     sort(interval,interval+N,cmp);
29     //for(int i=0;i<N;i++)
30     //cout<<interval[i].a<<" "<<interval[i].b<<endl;
31     int number=1;
32     int point=interval[0].b;
33     for(int i=1;i<N;i++){
34         
35         if(point<interval[i].a)
36         {
37             number++;
38             point=interval[i].b;
39         }
40     }
41     cout<<number<<endl;
42     return 0;
43 }
流转星云
原文地址:https://www.cnblogs.com/liuzhuan-xingyun/p/12491549.html