POJ 3190 Stall Reservations

29 篇文章 0 订阅
16 篇文章 0 订阅
Stall Reservations
Time Limit: 1000MS Memory Limit: 65536K
Total Submissions: 3660 Accepted: 1313 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

Hint
Explanation of the sample:

Here's a graphical schedule for this output:

Time 1 2 3 4 5 6 7 8 9 10

Stall 1 c1>>>>>>>>>>>>>>>>>>>>>>>>>>>

Stall 2 .. c2>>>>>> c4>>>>>>>>> .. ..

Stall 3 .. .. c3>>>>>>>>> .. .. .. ..

Stall 4 .. .. .. c5>>>>>>>>> .. .. ..

Other outputs using the same number of stalls are possible.


这道题跟那次市赛的题超时的原因是一样的,数据量是50000,如果不加优化,两个循环就容易超时,于是乎用优化,学到了一个新的stl的用法:

  优先队列里边存的是一个结构体的情况,一般情况下,只做过队列里边存的是一个数的情况,这样队列里先出的只能是一个数,没有混淆的其他数,但是存结构体就不行了,结构体里边存了多组数据,这样一来内存就出现了错误。查阅了资料之后发现,结构体是一种类,可以在结构体里定义存入队列当中,是怎么样的(应该按照怎么样的顺序出队列),相关代码如下:

struct node
{
    int start;
    int last;
    int late;
    int line;
    bool operator()(const node& a, const node& b)
	{
		return a.last > b.last;
	}
}row[50010];

然后再定义一个结构体类型的队列就可实现按照结束时间来先出了。


#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
#include <queue>
using namespace std;
struct node
{
    int start;
    int last;
    int late;
    int line;
    bool operator()(const node& a, const node& b)
	{
		return a.last > b.last;
	}
}row[50010];

bool cmp(struct node a,struct node b)
{
    if(a.start!=b.start)
        return a.start<b.start;
    return a.last<b.last;
}

bool cmq(struct node a,struct node b)
{
    return a.late<b.late;
}
int main(void)
{
   //freopen("A.txt","r",stdin);
    int n;
    scanf("%d",&n);
    for(int i=1;i<=n;i++)
    {
        int s,l;
      scanf("%d%d",&s,&l);
      row[i].start=s;
      row[i].last=l;
      row[i].late=i;
    }
    sort(row+1,row+n+1,cmp);
  //  rows[1].start=row[1].start;
   // rows[1].last=row[1].last;
   // rows[1].late=1;
    row[1].line=1;
    priority_queue<struct node, vector<struct node>, struct node> p;
    p.push(row[1]);
    int k=1;
    for(int i=2;i<=n;i++)
    {
     //   printf("%d\n",i);
           if(row[i].start>p.top().last)
           {
               row[i].line=p.top().line;
               p.pop();
               p.push(row[i]);
           }
           else
           {
               k++;
               row[i].line=k;
               p.push(row[i]);
           }
    }
    sort(row+1,row+n+1,cmq);
    printf("%d\n",p.size());
    for(int i=1;i<=n;i++)
        printf("%d\n",row[i].line);
    return 0;
}

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值