poj 3190 優先隊列

poj3190

思路
因爲問是最少要多少個地方纔能安排好所有牛,所以對於牛按照開始時間升序 開始時間一樣按結束時間升序
我們考慮把每頭牛丟進去,當前這頭牛進去的話 把這頭牛的開始時間與已經進去的牛的最早結束的時間比較,如果結束時間>最早結束的時間 那麼就是一頭牛代替另一頭牛進去,那麼自然所需要的個數就不變,如果開始時間≤最早結束的時間,那麼我們需要新開闢一個地方,讓這頭牛進去
綜上所述 我們是需要一個可以支持自動排序 、插入、刪除的數據結構 自然是優先隊列了

維護一個以結束時間的小根堆即可

#include<iostream>
#include<queue>
#include<algorithm>
using namespace std;
struct node
{
    int s,e,id;
}a[500005];
struct nodee
{
    int e,id;
    friend bool operator<(nodee a,nodee b){      ///以結束時間的小根堆
        return a.e>b.e;
    }
};
bool cmp(node a,node b){

    return a.s==b.s?a.e<b.e:a.s<b.s;
}
int ans[500005];
int main(){
    
    ios::sync_with_stdio(0);
    int n;
    while(cin>>n){

        for(int i=1;i<=n;i++) cin>>a[i].s>>a[i].e,a[i].id=i;
        sort(a+1,a+1+n,cmp);///對牛的開始和結束時間進行升序
        priority_queue<nodee> q;
        q.push({a[1].e,1});
        ans[a[1].id]=1;
        int cnt=1;
        for(int i=2;i<=n;i++){
            nodee now=q.top();
             if(now.e>=a[i].s){///最先結束的時間 ≥ 當前的開始時間 要新加一個
                ans[a[i].id]=++cnt;
                q.push({a[i].e,cnt});
            }
            else///一頭牛出來 當前這頭進去
            {
                q.pop();
                ans[a[i].id]=now.id;///存這頭牛進入的編號
                q.push({a[i].e,now.id});
            }
        }
        cout<<cnt<<endl;
        for(int i=1;i<=n;i++) cout<<ans[i]<<endl;
    }
    return 0;
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章