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


    http://poj.org/problem?id=3190

    有n头挑剔的奶牛,只会在一个精确时间挤奶,而一头奶牛需要占用一个畜栏,并且不会和其他奶牛分享,每头奶牛都会有一个开始时间和结束时间,问至少需要多少个 畜栏  并且输出奶牛 i 在哪个畜栏 内挤奶。

    首先应该对奶牛以开始时间从小到大排序,然后每次在开始的奶牛中选择结束时间最小的奶牛,这就需要用优先队列。看是否可以用这个畜栏,可以就加入到队列中,不可以就重新加一个畜栏。

     1 #include <iostream>
     2 #include <cstdio>
     3 #include <cmath>
     4 #include <vector>
     5 #include <cstring>
     6 #include <string>
     7 #include <algorithm>
     8 #include <string>
     9 #include <set>
    10 #include <functional>
    11 #include <numeric>
    12 #include <sstream>
    13 #include <stack>
    14 #include <map>
    15 #include <queue>
    16 
    17 #define CL(arr, val)    memset(arr, val, sizeof(arr))
    18 
    19 #define ll long long
    20 #define inf 0x7f7f7f7f
    21 #define lc l,m,rt<<1
    22 #define rc m + 1,r,rt<<1|1
    23 #define pi acos(-1.0)
    24 
    25 #define L(x)    (x) << 1
    26 #define R(x)    (x) << 1 | 1
    27 #define MID(l, r)   (l + r) >> 1
    28 #define Min(x, y)   (x) < (y) ? (x) : (y)
    29 #define Max(x, y)   (x) < (y) ? (y) : (x)
    30 #define E(x)        (1 << (x))
    31 #define iabs(x)     (x) < 0 ? -(x) : (x)
    32 #define OUT(x)  printf("%I64d
    ", x)
    33 #define lowbit(x)   (x)&(-x)
    34 #define Read()  freopen("a.txt", "r", stdin)
    35 #define Write() freopen("b.txt", "w", stdout);
    36 #define maxn 1000000000
    37 #define N 50010
    38 using namespace std;
    39 
    40 struct point
    41 {
    42     int x,y,pos;
    43     bool operator < (const point &a) const 
    44     {
    45         return y>a.y;  //按结束时间从小到大排序
    46     }
    47 };
    48 
    49 bool cmp(point a,point b)
    50 {
    51     return a.x<b.x;  //按开始时间从小到大排序
    52 }
    53 point p[N];
    54 int use[N];   //存储第i头牛在哪个畜栏内挤奶
    55 priority_queue<point>q;
    56 int main()
    57 {
    58   //Read();
    59    //Write()
    60    int n;
    61    while(~scanf("%d",&n))
    62    {
    63        for(int i=0;i<n;i++)
    64        {
    65            scanf("%d%d",&p[i].x,&p[i].y);
    66            p[i].pos=i;
    67        }
    68        sort(p,p+n,cmp);  //先对奶牛排序
    69        q.push(p[0]);   //把第一头奶牛加入队列
    70        int ans=1;
    71        use[p[0].pos]=1;
    72        for(int i=1;i<n;i++)
    73        {
    74            if(!q.empty()&&q.top().y<p[i].x)  //队列非空并且当前奶牛的开始时间大于队列顶点的结束时间
    75            {
    76                use[p[i].pos]=use[q.top().pos];  //共用一个畜栏
    77                q.pop();
    78            }
    79            else     //否则重新加一个 畜栏
    80            {
    81                ans++;
    82                use[p[i].pos]=ans;
    83            }
    84            q.push(p[i]);
    85        }
    86        printf("%d
    ",ans);
    87        for(int i=0;i<n;i++)
    88         printf("%d
    ",use[i]);
    89        while(!q.empty()) q.pop();
    90    }
    91    return 0;
    92 }
  • 相关阅读:
    三位数
    顺序表应用4:元素位置互换之逆置算法
    顺序表应用5:有序顺序表归并
    顺序表应用6:有序顺序表查询
    数据结构实验之图论八:欧拉回路
    串结构练习——字符串连接 Description
    图的基本存储的基本方式三
    数据结构实验之图论四:迷宫探索
    数据结构实验之图论二:图的深度遍历
    图的基本存储的基本方式二
  • 原文地址:https://www.cnblogs.com/nowandforever/p/4415695.html
Copyright © 2020-2023  润新知