• Stall Reservations POJ


    Stall Reservations
    Time Limit: 1000MS   Memory Limit: 65536K
    Total Submissions: 11002   Accepted: 3886   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.

    Source

     
    题意:人去挤奶牛,一个人挤一头,输出最少几人及牛奶并且哪只牛哪个人
    题解:贪心加优先队列,将开始时间在前面的排在前面,开始时间一样的就把结束时间后的排在后面
    #include<cstdio>
    #include<iostream>
    #include<algorithm>
    #include<cstring>
    #include<sstream>
    #include<cmath>
    #include<cstdlib>
    #include<queue>
    #include<map>
    #include<set>
    using namespace std;
    #define INF 0x3f3f3f3f
    const int maxn=60000;
    int n,use[maxn];
    
    struct node
    {
        int st;
        int en;
        int pos;
        bool operator < (const node &a)const
        {
            if(en==a.en)
                return st>a.st;
            return en>a.en;
        }
    }a[maxn];
    priority_queue<node>q;
    bool cmp(node a,node b)
    {
        if(a.st==b.st)
            return a.en<b.en;     //排序,按照开始时间排序,开始时间相同的结束时间迟的排后面
        return a.st<b.st;
    }
    
    int main()
    {
        while(scanf("%d",&n)!=EOF)
        {
            for(int i=0;i<n;i++)
            {
                scanf("%d %d",&a[i].st,&a[i].en);
                a[i].pos=i;
            }
            sort(a,a+n,cmp);
            q.push(a[0]);
            int ans=1;
            use[a[0].pos]=1;
            for(int i=1;i<n;i++)
            {
                if(!q.empty() && q.top().en < a[i].st)
                {
                    use[a[i].pos]=use[q.top().pos];
                    q.pop();
                }
                else
                {
                    ans++;
                    use[a[i].pos]=ans;
                }
                q.push(a[i]);
            }
            cout<<ans<<endl;
            for(int i=0;i<n;i++)
                cout<<use[i]<<endl;
            while(!q.empty())
                q.pop();
        }
        return 0;
    }
  • 相关阅读:
    数组、List和ArrayList的区别
    Spring 学习笔记(一)——Spring 基本概念和体系概览
    解压大文件提示C盘空间不够的问题
    在Struts2 Action中快速简便的访问Request、Session等变量
    Java 以及JEE环境快速搭建
    JAVA对象布局之对象头(Object Header)
    Docker之两小时入门
    Java创建多线程的几种方式
    JAVA并发之加锁导致的活跃性问题
    JAVA并发之多线程引发的问题剖析以及如何保证线程安全
  • 原文地址:https://www.cnblogs.com/smallhester/p/9499874.html
Copyright © 2020-2023  润新知