码迷,mamicode.com
首页 > 编程语言 > 详细

贪心算法

时间:2019-07-22 20:10:47      阅读:136      评论:0      收藏:0      [点我收藏+]

标签:ace   amp   printf   全局最优   clu   算法   最优   区间   space   

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 }

 

贪心算法

标签:ace   amp   printf   全局最优   clu   算法   最优   区间   space   

原文地址:https://www.cnblogs.com/blue-lin/p/11227933.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!