贪心问题——区间选点
问题描述:
数轴上有 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
解决思路:
贪心策略:选点之前先要对区间排个序嘛,一共有两种策略
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 }
流转星云