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
Inputcopy Outputcopy 5 1 10 2 4 3 6 5 8 4 7 4 1 2 3 2 4Hint
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<queue> #include<algorithm> #define max 50005 using namespace std; struct cow{ int start; int end; int id; }a[max]; int n; int ans[max]; bool cmp(cow a,cow b){ return a.start<b.start; } bool operator > (cow a,cow b){ return a.end>b.end; } int main(){ priority_queue<cow,vector<cow>, greater<cow> >que; scanf("%d",&n); for(int i=0;i<n;i++){ scanf("%d%d",&a[i].start,&a[i].end); a[i].id=i; } sort(a,a+n,cmp); fill(ans, ans + n, 1); ans[0]=1; que.push(a[0]); for(int i=1;i<n;i++){ cow temp= que.top(); if(a[i].start>temp.end){ ans[a[i].id]=ans[temp.id]; que.pop(); } else{ ans[a[i].id]=que.size()+1; } que.push(a[i]); } printf("%d\n",que.size()); for(int i=0;i<n;i++){ printf("%d\n",ans[i]); } }
总结,在我看来贪心不是算法,更是思维,所以贪心真的很狗,但是也很屌