POJ3190 Stall Reservations 【贪婪】

Stall Reservations

Time Limit: 1000MS   Memory Limit: 65536K
Total Submissions: 3106   Accepted: 1117   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.

Source

USACO 2006 February Silver

/*
** 用堆维护的贪心题。先依照開始时间排序。再将牛依次放入堆里。放入之前更新堆顶元素。
** TLE到吐。。。
*/

#include <stdio.h>
#include <string.h>
#include <algorithm>
#include <queue>

#define maxn 50010
using namespace std;

struct Node2 {
    int num, u, v;
    friend bool operator<(const Node2& a, const Node2& b) {
        return a.v > b.v;
    }
} cow[maxn];
int ans[maxn];

bool cmp(const Node2& a, const Node2& b) {
    return a.u < b.u;
}

int main() {
    int N, i, j, sum, u, v, flag;
    Node2 tmp;
    while(scanf("%d", &N) == 1) {
        sum = 0;
        for(i = 0; i < N; ++i) {
            scanf("%d%d", &u, &v);
            cow[i].num = i + 1;
            cow[i].u = u;
            cow[i].v = v;
            ans[i + 1] = 0;
        }
        sort(cow, cow + N, cmp);

        priority_queue<Node2> PQ;
        PQ.push(cow[0]);
        ans[cow[0].num] = ++sum;

        for(i = 1; i < N; ++i) {
            tmp = PQ.top();
            if(cow[i].u > tmp.v) {
                tmp.v = cow[i].v;
                ans[cow[i].num] = ans[tmp.num];
                PQ.pop(); PQ.push(tmp);
            } else {
                ans[cow[i].num] = ++sum;
                PQ.push(cow[i]);
            }
        }

        printf("%d\n", sum);
        for(i = 1; i <= N; ++i)
            printf("%d\n", ans[i]);
    }
    return 0;
}

超时代码1:

#include <stdio.h>
#include <string.h>
#include <algorithm>

#define maxn 50010
using std::sort;

struct Node {
    int u, v;
} E[maxn];
struct Node2 {
    int num, u, v;
} cow[maxn];
int ans[maxn];

bool cmp(const Node2& a, const Node2& b) {
    return a.u < b.u;
}

int main() {
    int N, i, j, sum, u, v;
    while(scanf("%d", &N) == 1) {
        sum = 0;
        for(i = 0; i < N; ++i) {
            scanf("%d%d", &u, &v);
            cow[i].num = i + 1;
            cow[i].u = u;
            cow[i].v = v;
        }
        sort(cow, cow + N, cmp);

        for(i = 0; i < N; ++i) {
            E[i].v = 0;
            for(j = 0; j <= i; ++j) {
                if(cow[i].u > E[j].v) {
                    if(!E[j].v) ++sum;
                    E[j].v = cow[i].v;
                    E[j].u = cow[i].u;
                    ans[cow[i].num] = j + 1;
                    break;
                }
            }
        }

        printf("%d\n", sum);
        for(i = 1; i <= N; ++i)
            printf("%d\n", ans[i]);
    }
    return 0;
}

超时代码2:

#include <stdio.h>
#include <string.h>
#include <algorithm>

#define maxn 50010
using std::sort;

struct Node {
    int u, v;
} E[maxn];
struct Node2 {
    int num, u, v;
} cow[maxn];
int ans[maxn];

bool cmp(const Node2& a, const Node2& b) {
    return a.u < b.u;
}

int main() {
    int N, i, j, sum, u, v, flag;
    while(scanf("%d", &N) == 1) {
        sum = 0;
        for(i = 0; i < N; ++i) {
            scanf("%d%d", &u, &v);
            cow[i].num = i + 1;
            cow[i].u = u;
            cow[i].v = v;
            ans[i + 1] = 0;
        }
        sort(cow, cow + N, cmp);

        for(i = 0; i < N; ++i) {
            if(ans[cow[i].num]) continue;
            ans[cow[i].num] = ++sum;
            flag = cow[i].v;
            for(j = i + 1; j < N; ++j)
                if(!ans[cow[j].num] && cow[j].u > flag) {
                    flag = cow[j].v;
                    ans[cow[j].num] = sum;
                }
        }

        printf("%d\n", sum);
        for(i = 1; i <= N; ++i)
            printf("%d\n", ans[i]);
    }
    return 0;
}

版权声明:本文博客原创文章,博客,未经同意,不得转载。

时间: 2024-11-11 03:14:52

POJ3190 Stall Reservations 【贪婪】的相关文章

poj3190 Stall Reservations(贪心+STL)

https://vjudge.net/problem/POJ-3190 cin和scanf差这么多么..tle和300ms 思路:先对结构体x升序y升序,再对优先队列重载<,按y升序. 然后依次入队,如果node[i].x<=q.top().y ans++, 否则出队,入队,使用出队的那个摊位. 1 #include<iostream> 2 #include<cstdio> 3 #include<queue> 4 #include<cstring>

POJ3190 Stall Reservations 贪心

这是个典型的线程服务区间模型.一些程序要在一段时间区间上使用一段线程运行,问至少要使用多少线程来为这些程序服务? 把所有程序以左端点为第一关键字,右端点为第二关键字从小到大排序.从左向右扫描.处理当前区间时,提取出所有线程中最后一个被服务中的区间中右端点最小的区间(可用小根堆实现),若当前区间左端点值大于提取出的区间的右端点的值,则把当前区间安排到选中的区间的那个线程,否则只能再派出一个线程来负责该区间了. 此贪心是正确的,因为正在被服务中的区间中右端点最小的区间,能使当前区间不被该线程负责的当

POJ 3190 Stall Reservations (优先队列)C++

Stall Reservations Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 7646   Accepted: 2710   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 in

bzoj1651[Usaco2006 Feb]Stall Reservations 专用牛棚*

bzoj1651[Usaco2006 Feb]Stall Reservations 专用牛棚 题意: 有N头牛,每头牛有个喝水时间段,这段时间它将专用一个棚.现在给出每头牛的喝水时间段,问至少要多少个棚才能满足它们的要求.n≤50000,时刻≤1000000. 题解: 时间段左端点对应的sum元素++,右端点+1对应的sum元素--,最后从左到右加一遍就可以得到每个时刻的喝水牛数,找个最大值就可以了. 代码: 1 #include <cstdio> 2 #include <cstring

BZOJ 1651: [Usaco2006 Feb]Stall Reservations 专用牛棚( 线段树 )

线段树.. -------------------------------------------------------------------------------------- #include<cstdio> #include<cstring> #include<algorithm> #include<iostream> #define rep( i , n ) for( int i = 0 ; i < n ; i++ ) #define c

POJ 3190 Stall Reservations(贪心)

Stall Reservations Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 3590   Accepted: 1284   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 in

BZOJ 1651: [Usaco2006 Feb]Stall Reservations 专用牛棚

题目 1651: [Usaco2006 Feb]Stall Reservations 专用牛棚 Time Limit: 10 Sec  Memory Limit: 64 MBSubmit: 553  Solved: 307[Submit][Status] Description Oh those picky N (1 <= N <= 50,000) cows! They are so picky that each one will only be milked over some preci

POJ 3190 Stall Reservations(贪心+优先队列优化)

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 reserv

Stall Reservations(POJ 3190 贪心+优先队列)

Stall Reservations Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 4434   Accepted: 1588   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 in