POJ 2376 (區間問題,貪心)

題目連接: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;
}
相關文章
相關標籤/搜索