贪心(好题)--poj3190

23 篇文章 0 订阅
Language:
Stall Reservations
Time Limit: 1000MS Memory Limit: 65536K
Total Submissions: 2112 Accepted: 751 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

刚开始写了一段比较暴力的代码,赤裸裸的超时,学习了一下别人的。
#include<iostream>
#include<set>
#include<cstdio>
#include<algorithm>
using namespace std;
struct cow
{
    int id,l,r;
    bool operator<(cow a) const
    {
        if(l!=a.l)
        return l<a.l;
        return r<a.r;
    }
}x[50010];
struct stall
{
    int id,t;
    stall(int x,int y)
    {
        id=y;
        t=x;
    }
    stall(){};
    bool operator<(stall a) const
    {
        return t<a.t;
    }
};
int ans[50010];
int main()
{
    //freopen("in.txt","r",stdin);
    int n;
    while(cin>>n)
    {
        for(int i=1;i<=n;i++)
        {
            scanf("%d%d",&x[i].l,&x[i].r);
            x[i].id=i;
        }
        sort(x+1,x+n+1);
        multiset<stall> q;
        int num=0;
        for(int i=1;i<=n;i++)
        {
            int val=x[i].l;
            multiset<stall>::iterator it;
            it=q.lower_bound(stall(val,1));
            if(it==q.begin())
            {
                stall a;
                a.t=x[i].r;
                a.id=++num;
                q.insert(a);
                ans[x[i].id]=num;
            }
            else
            {
                it--;
                stall k=*it;
                k.t=x[i].r;
                ans[x[i].id]=k.id;
                q.erase(it);
                q.insert(k);
            }
        }
        cout<<num<<endl;
        for(int i=1;i<=n;i++)
            cout<<ans[i]<<endl;
    }
    return 0;
}


  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值