http://poj.org/problem?id=3190
Time Limit: 1000MS | Memory Limit: 65536K | |||
Total Submissions: 3567 | Accepted: 1276 | Special Judge |
Description
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
Lines 2..N+1: Line i+1 describes cow i's milking interval with two space-separated integers.
Output
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
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
分析:
这个题是说一些奶牛要在指定的时间内挤牛奶,而一个机器只能同时对一个奶牛工作。给你每头奶牛的指定时间的区间,问你最小需要多少机器。
最开始想的是以奶牛要求时间的结束点从小到大进行排序,但后来发现这样的想法是错误的。
后来经过调整,应该先按奶牛要求的时间起始点进行从小到大排序,然后维护一个优先队列,里
面以已经开始挤奶的奶牛的结束时间早为优先。然后每次只需要检查当前是否有奶牛的挤奶工作已经完成的机器即可,若有,则换那台机器进行工作。若没有,则加一台新的机器。
AC代码:
#include<cstdio>
#include<cstring>
#include<iostream>
#include<algorithm>
#include<queue>
using namespace std;
const int maxn=;
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=;i<n;i++)
{
scanf("%d%d",&a[i].l,&a[i].r);
a[i].pos=i;
}
sort(a,a+n,cmp);
q.push(a[]);
int now=,ans=;
use[a[].pos]=;
for(int i=;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=;i<n;i++)
printf("%d\n",use[i]);
while(!q.empty())
q.pop();
}
return ;
}
AC代码:
#include<iostream>
#include<algorithm>
#include<cstring>
#include<queue>
#include<cstdio>
using namespace std;
struct TT
{
int x, y, id;
}a[];
int vis[];
bool cmp( TT m, TT n)
{
if((m.x<n.x) || (m.x==n.x && m.y<n.y)) return true;
return false;
}
bool operator<( TT a, TT b ){
return a.y>b.y;
}
int main()
{
int T,i;
while(~scanf("%d",&T))
{
priority_queue<TT>pp;
memset(vis,,sizeof(vis));
for(i=;i<=T;i++)
{
scanf("%d %d",&a[i].x,&a[i].y);
a[i].id = i;
}
TT now;
sort(a+,a++T,cmp);
int ans = ;
vis[a[].id]=ans;
pp.push(a[]);
for(i=; i<=T; i++)
{
now = pp.top();
if(a[i].x>now.y)
{
vis[a[i].id] = vis[now.id];
pp.pop();//取出该点;
now.y = a[i].y;//更新末尾点;
pp.push(now);
}
else
{
vis[a[i].id] = ++ans;
pp.push(a[i]);
}
}
printf("%d\n",ans);
for(int i=;i<=T;i++)
{
printf("%d\n",vis[i]);
}
}
return ;
}