【贪心】【排序】Stall Reservations(poj P3190)

题目:

哦,那些挑剔的(1<=n<=50,000)奶牛!他们太挑剔了,每个都只能在一定的时间间隔内挤。b(1<=a<=b<=1,000,000)显然包括a倍和b倍,fj必须建立一个预订系统,以确定每只奶牛在挤奶时间可以分配到哪个档位。当然,没有奶牛会和其他奶牛分享这样一个私密的时刻。
帮助fj确定:
谷仓里需要的最低限度的摊位数量,以便每只奶牛都有自己的私人挤奶时间
随着时间的推移,奶牛被分配到这些摊位
对于每个测试数据集,很多答案都是正确的;程序会对你的答案进行评分。


输入:

第1行:单个整数,n
第2行。…n+1:I+1行描述了奶牛I与两个空间分隔整数的挤奶间隔。


输出:

第1行:谷仓必须有的最低限度的摊位数量。
第2行。…n+1:I+1行描述了我在奶牛挤奶期间分配给它的位置。


样本输入

5
1 10
2 4
3 6
5 8
4 7

样本输出

4
1
2
3
2
4

思路:

这题用贪心来做,先按吃草时间从小到大排序,然后找空栅栏,把牛关在里面,不然新开一个。
最后,不加register会莫名TLE…


C o d e Code Code:

#include<cstdio>
#include<iostream>
#include<algorithm>
#define rr register
using namespace std;
int n;
int zl[25000];
bool pd;
struct node
{
	int begin,end,xz,where;//begin是开始吃的时间,end是结束时间,xz是牛去到哪个栅栏,where是记录牛
}e[100001];
bool cmp1(node x,node y){return x.begin<y.begin;}//排序
bool cmp2(node x,node y){return x.where<y.where;}
int main()
{
	scanf("%d",&n);
	for (rr int i = 1; i <= n; ++i)
	{
		scanf("%d %d",&e[i].begin , &e[i].end);
		e[i].where = i;//记录
	}
	sort(e+1,e+1+n,cmp1);
	for (rr int i = 1; i <= n; ++i)
	{
		pd = false;//标记
		for (rr int j = 1; j <= zl[0]; ++j)//枚举栅栏
		if (e[i].begin > zl[j])//有没有牛在吃
		{
			zl[j] = e[i].end;
			e[i].xz = j;
			pd = true;
			break;
		}
		if (! pd)//栅栏不空(满了)
		{
			zl[0]++;
			zl[zl[0]] = e[i].end;
			e[i].xz = zl[0];
		} 
	}
	sort(e+1,e+1+n,cmp2);//排回来
	printf("%d\n",zl[0]);
	for (rr int i = 1; i <= n; ++i)
	printf("%d\n",e[i].xz);
} 
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值