【YBT高效进阶】1基础算法/2贪心算法/3畜栏预定

【YBT高效进阶】1基础算法/2贪心算法/3畜栏预定

内存限制:256 MiB
时间限制:1000 ms
标准输入输出
题目类型:传统
评测方式:Special Judge

题目描述

有 n 头牛在畜栏中吃草。每个畜栏在同一时间段只能提供给一头牛吃草,所以可能会需要多个畜栏,给出第 i 头牛开始吃草的时间区间[ai,bi] ,求需要的最少畜栏数和每头牛对应的畜栏方案。

输入格式

第一行一个正整数 。

接下来 n 行,第 i 行两个正整数 Ai,bi

输出格式

第一行一个整数,表示需要的最少畜栏数。

接下来 n 行,第 i 行一个整数表示第 头牛的对应畜栏,编号是从 1 开始的连续整数,方案合法即可。

样例

样例输入
5
1 10
2 4
3 6
5 8
4 7
样例输出
4
1
2
3
2
4

数据范围与提示

对于 100% 的数据,有 1<=n<=50000,1<=a1,bi<=106

思路

先排序。
用堆优化,
判断每一个,是否符合时间。
不符合,新建畜栏。

代码

#include<iostream>
#include<cstdio>
#include<algorithm>
#include<cmath>
#include<queue>
using namespace std;
int lst[50010],ans[50010];
struct jgt
{
    
    
	int l,r,id;
}a[50010];
bool cmp(jgt t1,jgt t2)
{
    
    
	return t1.l<t2.l;
}
struct NODE
{
    
    
	int r,id;
};
bool operator < (const NODE t1, const NODE t2)
{
    
    
	return t1.r>t2.r;
}
priority_queue<NODE>q;
int main()
{
    
    
	int n,len=0,i,j;
	NODE tem;
	scanf("%d",&n);
	for(i=1;i<=n;i++)
		scanf("%d%d",&a[i].l,&a[i].r),a[i].id=i;
	sort(a+1,a+1+n,cmp);//排序 
	for(i=1;i<=n;i++)
	{
    
    
		if(q.empty()||a[i].l<=q.top().r)
		{
    
    
			ans[a[i].id]=q.size()+1;
			tem.r=a[i].r,tem.id=ans[a[i].id]; 
			q.push(tem);
		}
		else
		{
    
    
			ans[a[i].id]=q.top().id;
			q.pop();
			tem.r=a[i].r,tem.id=ans[a[i].id];
			q.push(tem);
		}
	}
	printf("%d\n",q.size());
	for(i=1;i<=n;i++)
		printf("%d\n",ans[i]);
	return 0;
}

猜你喜欢

转载自blog.csdn.net/weixin_46975572/article/details/113137231