zoukankan      html  css  js  c++  java
  • 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 }
  • 相关阅读:
    Delphi XE5 android 蓝牙通讯传输
    Delphi XE5 android toast
    Delphi XE5 android openurl(转)
    Delphi XE5 如何设计并使用FireMonkeyStyle(转)
    Delphi XE5 android 捕获几个事件
    Delphi XE5 android listview
    Delphi XE5 android 黑屏的临时解决办法
    Delphi XE5 android popumenu
    Delphi XE5 android 获取网络状态
    Delphi XE5 android 获取电池电量
  • 原文地址:https://www.cnblogs.com/nowandforever/p/4415695.html
Copyright © 2011-2022 走看看