題目連接:http://poj.org/problem?id=2376ios
題目大意:選擇一些區間使得可以覆蓋1-T中的每個點,而且區間數最少spa
題目分析:這道題目很明顯能夠用貪心法來解決。但題目沒有看起來那麼簡單,有許多的坑。code
個人貪心策略以下:blog
1.將區間按照起點排序,而且保證起點相同的,終點大的排在前邊排序
2.在前一個選取的區間範圍[L0,R0+1]中,選取起點在此範圍但終點最靠右的一個區間ci
3.重複這個過程get
另外,還有幾點須要注意的地方:it
1.要保證第一個區間起點和最後一個區間終點符合1-L的條件io
2.前一個區間的終點能夠不與後一個區間的起點重合class
代碼以下:
#include <iostream> #include <algorithm> using namespace std; struct Line{ int x,y; }A[25000 + 100]; bool cmp(const Line& l1, const Line& l2){ if(l1.x == l2.x) return l1.y > l2.y; return l1.x < l2.x; } int main(){ ios::sync_with_stdio(false); int N, T; while(cin >> N >> T){ for(int i = 0; i < N; i++) cin >> A[i].x >> A[i].y; sort(A, A + N, cmp); int i = 0, cnt = 1, ok = 1; if(A[i].x > 1)ok = 0; else while(i < N -1 && A[i].y < T){ int t = i; for(int j = i + 1; j < N &&A[j].x <= A[i].y+1; j++) if(A[j].y > A[t].y) t = j; if(t == i){ ok = 0; break; } else i = t, cnt++; } if(A[i].y < T) ok = 0; if(ok)cout << cnt << endl; else cout << -1 << endl; } return 0; }