Stall Reservations
Time Limit: 1000MS | Memory Limit: 65536K | |||
Total Submissions: 5738 | Accepted: 2095 | 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:
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
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.
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.
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
大意说给一群挑剔的母牛挤奶,母牛会在时间段 A-B 内工作,工作的时候必要有一个独立的小空间,(当上一个母牛用完,下一个母牛可以用,如果都在使用,就增加一个新的空间)
问怎样才能用最少的空间数目来完成所以牛的工作,并输出他们依次使用的空间编号
**思路 贪心算法,下面是大神的思路
应该先按奶牛要求的时间起始点进行从小到大排序,然后维护一个优先队列,里面以已经开始挤奶的奶牛的结束时间早为优先。然后每次只需要检查当前是否有奶牛的挤奶工作已经完成的机器即可,若有,则换那台机器进行工作。若没有,则加一台新的机器。
下面代码注释为个人见解
#include <iostream>
#include <algorithm>
#include <cstdio>
#include <queue>
using namespace std;
struct Cow{
int beg,end,num;
bool operator< (const Cow &b)const
{
if(end == b.end)//按结束时间升序排列
return beg > b.beg;
return end > b.end;
}
};
bool compare(Cow a,Cow b)
{
if(a.beg!=b.beg) return a.beg < b.beg;
else return a.end < b.end;
}
int use[50001];
Cow cow[50001];
int N;
int main()
{
while(~scanf("%d",&N))
{
fill(use,use+N+1,0);
for(int i=0;i<N;i++)
{
scanf("%d %d",&cow[i].beg,&cow[i].end);
cow[i].num = i;
}
sort(cow,cow+N,compare);
priority_queue<Cow> que;//优先队列用来表示正在挤奶的奶牛
que.push(cow[0]);
int ans = 1;
use[cow[0].num] = 1;
for(int i=1;i<N;i++)
{
if(!que.empty() && que.top().end < cow[i].beg)//如果有奶牛在工作,且结束时间小于当前奶牛的开始时间
{
use[cow[i].num] = use[que.top().num];//用上一个奶牛的位置,
que.pop();//把没工作的剔除队列
}else
{
ans++;//如果没有满足条件的就多增加一个位置
use[cow[i].num] = ans;
}
que.push(cow[i]);//把工作的奶牛给放进队列
}
printf("%d\n",ans);
for(int i=0;i<N;i++)
printf("%d\n",use[i]);
}
return 0;
}
奈何我冒泡的算法如何打动你超时的心!!!