zoukankan      html  css  js  c++  java
  • Stall Reservations

    题目链接http://poj.org/problem?id=3190

    Stall Reservations
    Time Limit: 1000MS   Memory Limit: 65536K
    Total Submissions:10223   Accepted:3608   Special Judge

    Description

    Oh those picky N (1 <= N <= 50,000) cows! They are so picky that each one will only be milked over some precise time interval A..B (1 <= A <= B <= 1,000,000), which includes both times A and B. Obviously, FJ must create a reservation system to determine which stall each cow can be assigned for her milking time. Of course, no cow will share such a private moment with other cows. 

    Help FJ by determining:
    • The minimum number of stalls required in the barn so that each cow can have her private milking period
    • An assignment of cows to these stalls over time
    Many answers are correct for each test dataset; a program will grade your answer.

    Input

    Line 1: A single integer, N 

    Lines 2..N+1: Line i+1 describes cow i's milking interval with two space-separated integers.

    Output

    Line 1: The minimum number of stalls the barn must have. 

    Lines 2..N+1: Line i+1 describes the stall to which cow i will be assigned for her milking period.

    Sample Input

    5
    1 10
    2 4
    3 6
    5 8
    4 7

    Sample Output

    4
    1
    2
    3
    2
    4

    Hint

    Explanation of the sample: 

    Here's a graphical schedule for this output: 

    Time     1  2  3  4  5  6  7  8  9 10
    
    Stall 1 c1>>>>>>>>>>>>>>>>>>>>>>>>>>>
    Stall 2 .. c2>>>>>> c4>>>>>>>>> .. ..
    Stall 3 .. .. c3>>>>>>>>> .. .. .. ..
    Stall 4 .. .. .. c5>>>>>>>>> .. .. ..
    Other outputs using the same number of stalls are possible.

    需要用到贪心思想的模拟题。难点是维护每一个畜栏的结束时间。

    #include<cstdio>
    #include<cstdlib>
    #include<cstring>
    #include<iostream>
    #include<algorithm>
    #include<string>
    #include<vector>
    #include<queue>
    #define DEBUG(x) cout<<#x<<" = "<<x<<endl
    using namespace std;
    const int MAXN=5e4+100;
    struct cow{
        int s,e;
        int idx;
        cow(){}
        cow(int ss,int ee,int i):s(ss),e(ee),idx(i){}
        bool operator<(const cow &c)const
        {
            return s<c.s;
        }
    };
    struct stall{
        int et;
        int no;
        stall(int e,int n):et(e),no(n){}
        stall(){}
        bool operator<(const stall &s)const
        {
            return et>s.et;
        }
    };
    int N;
    int pos[MAXN];
    cow cowarray[MAXN];
    int main()
    {
    //    freopen("in.txt","r",stdin);
        cin>>N;
        for(int i=0;i<N ;i++ ){
            int s,e;
            scanf("%d%d",&s,&e);
            cowarray[i].s=s,
            cowarray[i].e=e,
            cowarray[i].idx=i;
        }
        sort(cowarray,cowarray+N);
        priority_queue<stall>pq;
        int cnt=1;
        cow &c=cowarray[0];
        pq.push(stall(c.e,cnt));
        ///这是一个经常出现的bug,且难以发现,排序之后的下标和之前的下标不同
    //    pos[0]=cnt;
        pos[c.idx]=cnt;
        for(int i=1;i<N ;i++ ){
            stall st=pq.top();
            if(st.et<cowarray[i].s){
                pq.pop();
                st.et=cowarray[i].e;
                int idx=cowarray[i].idx;
                pos[idx]=st.no;
                pq.push(st);
            }
            else{
                cnt++;
                cow &t=cowarray[i];
                pq.push(stall(t.e,cnt));
                pos[t.idx]=cnt;
            }
        }
        printf("%d
    ",cnt);
        for(int i=0;i<N ;i++ ){
            printf("%d
    ",pos[i]);
    //        cout<<pos[i]<<endl;
        }
    }
  • 相关阅读:
    Fleury算法
    2012 MultiUniversity Training Contest 2
    高斯若尔当消元法(线性代数)
    hdu4307(最小割)
    hdu4305(生成树计数)
    hdu4318(最短路)
    hdu4309(网络流)
    hdu4313(生成树)
    生成树计数
    MYSQL 远程登录及常用命令
  • 原文地址:https://www.cnblogs.com/MalcolmMeng/p/9286113.html
Copyright © 2011-2022 走看看