POJ 3190 Stall Reservations

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:
  • 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



大意说给一群挑剔的母牛挤奶,母牛会在时间段 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;
}
奈何我冒泡的算法如何打动你超时的心!!!


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值