演算法筆記_區間貪心
阿新 • • 發佈:2018-11-07
即所謂的區間不相交問題:給出N個開區間(x,y),從中選擇儘可能多的開區間,使得這些開區間兩兩沒有交集,問最多找到多少個區間?
思路:總選擇左端點最大的區間,若左端點一樣,就選右端點最小的.
給出如下例項程式碼:
#include<iostream> #include<stdlib.h> #include<algorithm>//algorithm意為"演算法",是C++的標準模版庫(STL)中最重要的標頭檔案之一,提供了大量基於迭代器的非成員模板函式。 using namespace std; const int maxn = 110; class Inteval { public: int x, y;//開區間左右端點 }I[maxn]; bool cmp(Inteval a, Inteval b) { if (a.x != b.x) return a.x > b.x;//先按左端大小從大到小排序 else return a.y < b.y;//左端點相同的按右端點從小到大排序 } int main(void) { int n; while (cin >> n, n != 0) { for (int i = 0; i < n; i++) { cin >> I[i].x >> I[i].y; } sort(I, I + n, cmp);//標頭檔案algorithm所包含,用途是把區間排序 int ans = 1, lastX = I[0].x;//ans記錄不相交區間個數,lastX記錄上一個被選中區間的左端點 for (int i = 1; i < n; i++) { if (I[i].y <= lastX)//如果該區間右端點在lastX左邊 { lastX = I[i].x;//就以I[i]作為新選中的區間 ans++;//不相交,區間個數就加1 } } cout << ans << endl; } system("pause"); return 0; }