poj 3190 Stall Reservations

xiaoxiao2021-02-28  91

题目地址

Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 6680 Accepted: 2412 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 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<cstring> #include<iostream> #include<algorithm> #include<queue> using namespace std; const int maxn=60000; int n,use[maxn]; struct Node { int l; int r; int pos; bool operator <(const Node &a)const { if(r==a.r) return l>a.l; return r>a.r; } }a[maxn]; priority_queue<Node> q; bool cmp(Node a,Node b) { if(a.l==b.l) return a.r<b.r; return a.l<b.l; } int main() { while(scanf("%d",&n)!=EOF) { for(int i=0;i<n;i++) { scanf("%d%d",&a[i].l,&a[i].r); a[i].pos=i; } sort(a,a+n,cmp); q.push(a[0]); int now=0,ans=1; use[a[0].pos]=1; for(int i=1;i<n;i++) { if(!q.empty()&&q.top().r<a[i].l) { use[a[i].pos]=use[q.top().pos]; q.pop(); } else { ans++; use[a[i].pos]=ans; } q.push(a[i]); } printf("%d\n",ans); for(int i=0;i<n;i++) printf("%d\n",use[i]); while(!q.empty()) q.pop(); } return 0; }
转载请注明原文地址: https://www.6miu.com/read-31758.html

最新回复(0)