選擇不相交區間(貪心)
阿新 • • 發佈:2018-12-21
- 記憶體限制:64MB 時間限制:1000ms
- 題目描述:
好吧。這道題的目的在於讓大家認識貪心問題的三個區間經典問題:區間選點問題,區間覆蓋問題,以及該題的選擇不相交區間問題。有許多的貪心問題可以轉化為這三類的問題。
那麼,對於該問題。就是給一系列的區間,求最多的區間,要求區間個數最多,這些區間不相交,需要注意的是這些區間都是閉區間。
輸入描述:
第一行一個數n為區間個數(n<=1000) 接下來有n行,每行有兩個數a,b分別為區間的兩個端點,a,b在int範圍。 EOF結尾。
輸出描述:
輸出如樣例所示
樣例輸入:
2 1 10 10 11 3 1 10 10 11 11 20
樣例輸出:
Case 1: 1. Case 2: 2.
解題思路:
選擇不相交區間問題:貪心思想,先按b從小到大進行排序,再選擇b0作為選點temp,如果出現ai>temp,則以bi作為temp,再按照這樣的方式迭代,直至所有區間遍歷完。這道題有點坑,輸入的時候要判斷兩個端點的大小。
#include <iostream> #include <algorithm> using namespace std; struct edge { int l, r; }e[1010]; int cmp(edge a, edge b) { return a.r < b.r; } int main() { int t = 1, n, ans, temp; while (cin >> n) { ans = 1; for (int i = 0; i < n; i++) { cin >> e[i].l >> e[i].r; if (e[i].l > e[i].r) swap(e[i].l, e[i].r); } sort(e, e + n, cmp); temp = e[0].r; for (int i = 1; i < n; i++) { if (e[i].l > temp) { ans++; temp = e[i].r; } } cout << "Case " << t++ << ":\n" << ans << ".\n"; } return 0; }