贪心-Stall Reservations POJ - 3190

结构体+优先队列+贪心

#include <iostream>
#include <cstdio>
#include <cstring>
#include <limits>
//#include <stack>
#include<queue>
#include <algorithm>
#define endl '\n'
#define _for(i,a,b) for(int i=a;i<b;i++)
using namespace std;
const int N = 1e5+5;
typedef long long ll;
int n; 
struct Node{
    int id,l,r,i;
    bool operator < (const Node &o){
        return i<o.i;
    }
}a[N]; 
struct Stall{
    int id,time;
    bool operator<(const Stall &o)const{
        return time>o.time;
    }
}b[N];
bool cmp(Node aa,Node bb){
    if( aa.l!=bb.l ) return aa.l<bb.l;
    else return aa.r<bb.r;
}
int main(){
    ios::sync_with_stdio(0),cin.tie(0),cout.tie(0);
    cin>>n;
    _for(i,1,n+1){
        a[i].i = i;
        cin>>a[i].l>>a[i].r;
        if( a[i].r<a[i].l ) swap( a[i].r,a[i].l );    
    } 
    sort(a+1,a+1+n,cmp);
    priority_queue<Stall> pq;
    a[1].id = 1;
    Stall tems; tems.id = 1,tems.time = a[1].r;
    pq.push( tems );
    int res_num = 1;
    _for(i,2,n+1){
        int Best = pq.top().time,ID = pq.top().id; pq.pop();
//        cout<<"cow "<<i<<":  l,r =" <<a[i].l<<" "<<a[i].r<<"  best choice is "<<ID<<endl; 
        if( a[i].l > Best ){
            a[i].id = ID;
            Stall tem ; tem.id = ID,tem.time = a[i].r;
            pq.push(tem);
        }
        else{//要加新的 
            Stall tem ; tem.id = ID,tem.time = Best;
            pq.push(tem);
            tem.id = ++res_num ; a[i].id = tem.id;
            tem.time = a[i].r ;
            pq.push(tem);
        }
    }
    sort(a+1,a+n+1);
    cout<<res_num<<endl;
    _for(i,1,n+1) cout<<a[i].id<< endl;
    return 0;
}

 

posted @ 2020-03-21 20:42  SunCY  阅读(88)  评论(0编辑  收藏  举报