题目:
哦,那些挑剔的(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);
}