zoukankan      html  css  js  c++  java
  • poj 3190 Stall Reservations

    题意:

    有若干只奶牛要进食,有进食的开始时间和结束时间。

    但是一个位置只能容纳一只奶牛,所以就需要较多的位置。

    显然,在一个位置,当一只奶牛进食结束后,另一只奶牛可以去进食。

    问最少的位置以及每只奶牛被安排的位置。

    思路:

    贪心。

    用一个优先队列存放奶牛,结束时间早的奶牛先出队列。

    将所有奶牛按照开始时间排序,若相同,那么结束时间早的放前面。

    对于一只奶牛X,若当前队列为空(只有开始放第一只奶牛才存在这个情况),那么随便安排一个小于已知位置个数的位置;

    若队列不为空,那么出队一只奶牛Y,如果Y的结束时间小于X的开始时间,那么X就可以被安排到Y的位置上;如果Y的结束时间小于等于X的开始时间,那么显然需要多安排一个位置。

    这个过程中不会出现某一个中间位置空缺的情况,因为空闲的位置一定会被占领。

    代码:

      1 #include <stdio.h>
      2 #include <string.h>
      3 #include <queue>
      4 #include <vector>
      5 #include <algorithm>
      6 using namespace std;
      7 
      8 const int N = 5e4 + 5;
      9 
     10 struct node
     11 {
     12     int st,en,id;
     13     node(){};
     14     node(int a,int b,int c)
     15     {
     16         st = a;
     17         en = b;
     18         id = c;
     19     }
     20     
     21     bool operator < (const node &x) const
     22     {
     23         return en > x.en;
     24     }
     25 };
     26 
     27 vector<node> g;
     28 
     29 bool cmp(node aa,node bb)
     30 {
     31     if (aa.st == bb.st) return aa.en < bb.en;
     32     return aa.st < bb.st;
     33 }
     34 
     35 int num[N];
     36 
     37 int solve(int n)
     38 {
     39     int cnt = 1;
     40     
     41     priority_queue<node> pq;
     42     
     43     for (int i = 0;i < n;i++)
     44     {
     45         if (pq.empty())
     46         {
     47             num[g[i].id] = cnt;
     48             pq.push(g[i]);
     49         }
     50         else
     51         {
     52             node x = pq.top();
     53             
     54             if (x.en < g[i].st)
     55             {
     56                 num[g[i].id] = num[x.id];
     57                 pq.pop();
     58                 pq.push(g[i]);
     59             }
     60             else
     61             {
     62                 num[g[i].id] = ++cnt;
     63                 pq.push(g[i]);
     64             }
     65         }
     66     }
     67     
     68     return cnt;
     69 }
     70 
     71 int main()
     72 {
     73     int n;
     74     
     75     while (scanf("%d",&n) != EOF)
     76     {
     77         g.clear();
     78         memset(num,0,sizeof(num));
     79         
     80         for (int i = 0;i < n;i++)
     81         {
     82             int x,y;
     83             
     84             scanf("%d%d",&x,&y);
     85             
     86             g.push_back(node(x,y,i));
     87         }
     88         
     89         sort(g.begin(),g.end(),cmp);
     90         
     91         int ans = solve(n);
     92         
     93         printf("%d
    ",ans);
     94         
     95         for (int i = 0;i < n;i++)
     96         {
     97             printf("%d
    ",num[i]);
     98         }
     99     }
    100     
    101     return 0;
    102 }
  • 相关阅读:
    mysql的小练习
    实用IMX6开发板来袭, 方便开发板方便你
    又到开学季 学习神器走一波 物联网开发板
    如何修改开发板主频--迅为iMX6UL开发板
    迅为4412开发板实战之智能网关项目
    iTOP-iMX6开发板Android系统下LVDS和HDMI双屏异显方法
    恩智浦iMX6Q核心板/飞思卡尔Cortex-A9高稳定性低功耗开发板
    嵌入式ARM开发板学习方法步骤
    迅为iMX6UL Cortex-A7架构单核ARM开发板接口介绍-支持定制
    三星系列NXP系列核心板设计研发-迅为嵌入式ARM方案提供商
  • 原文地址:https://www.cnblogs.com/kickit/p/8808127.html
Copyright © 2011-2022 走看看