貪心法的應用(2) 區間交集問題
阿新 • • 發佈:2019-01-13
問題描述:
給出N個開區間(X,Y),從中選擇儘可能多的開區間,使得這些開區間兩兩之間沒有交集
例如對開區間(1,3),(2,4),(3,5),(6,7)來說,可以選出最多3個區間(1,3),(3,5),(6,7)
思路:
首先對區間進行排序,將x較小的區間排在前面,因為如圖a所示,區間越小,所能容納的空間就越大
排序完成後,從最小的區間的下一區間開始,依次比較下一區間的x是否大於上一區間的y,如果成立,則說明它們不相交
然後把下一區間設定為當前區間,依次與接下來的區間比較,觀察是否相交即可。
#include <iostream> #include <algorithm> #include <string> #include <string.h> using namespace std; struct Interval { int x, y; }Intervals[1001]; bool cmp(Interval a, Interval b) { if (a.x != b.x) return a.x < b.x; else return a.y < b.y; } int main() { int n; scanf("%d", &n); for (int i = 0; i < n; ++i) { scanf("%d %d", &Intervals[i].x, &Intervals[i].y); } int ans = 1; int lastY = Intervals[0].y; for (int i = 1; i < n; ++i) { if (Intervals[i].x >= lastY) { lastY = Intervals[i].y; ans++; } } printf("%d", ans); system("PAUSE"); return 0; }