贪心算法
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 }