贪心算法

Date:2019-07-22 19:33:09

总是选择当前最优的策略,来获得全局最优的解

Sample:

 1 /*--------------------------区间贪心------------------------*/
 2 /*
 3 问题:区间不相交问题
 4 问题描述:
 5     给出N个开区间(x,y),从中选择尽可能多的开区间,使其两两之间没有交集
 6     如(1,3),(4,5),(6,7)
 7 贪心解法:
 8     若I1被I2包含,则选择I1
 9     总是先选择右端点最小,或左端点最大的区间
10 */
11 
12 #include <stdio.h>
13 #include <algorithm>
14 
15 using namespace std;
16 
17 const int maxn = 110;
18 
19 struct Inteval
20 {
21     int x, y;
22 }I[maxn];
23 
24 bool cmp(Inteval a, Inteval b)
25 {
26     if(a.x != b.x)
27     {
28         return a.x > b.x;    //按左端点由大到小排序
29     }
30     else
31     {
32         return a.y < b.y;    //左端点相同。则按照右端点从小到大排序
33     }
34 }
35 
36 int main(void)
37 {
38     int n;
39     while(scanf("%d", &n), n!=0)
40     {
41         for(int i=0; i<n; i++)
42         {
43             scanf("%d %d", &I[i].x, &I[i].y);
44         }
45 
46         sort(I, I+n, cmp);
47 
48         int ans = 1;            //ans记录区间不相交的个数
49         int last_x = I[0].x;    //last_x记录上一个被选中区间的左端点
50         for(int i=1; i<n; i++)
51         {
52             //if(I[i].y < last_x) 则为区间选点问题
53             if(I[i].y <= last_x)    //该区间右端点在last_x左边
54             {
55                 last_x = I[i].x;
56                 ans++;
57             }
58         }
59         printf("%d\n", ans);
60     }
61 
62     return 0;
63 
64 }

 

posted @ 2019-07-22 19:34  林東雨  阅读(182)  评论(0编辑  收藏  举报