【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;
}