• 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 }
  • 相关阅读:
    标准化组织 相关术语
    c++大作业五子棋-需求分析与设计方案
    [转载] ZooKeeper简介
    [转载] Netty源码分析
    [转载] Netty教程
    [转载] Java NIO与IO
    [转载] Java NIO教程
    [转载] 文件锁(Filelock)与锁定映射文件部分内容
    [转载] Java集合框架之小结
    [转载] 运维角度浅谈:MySQL数据库优化
  • 原文地址:https://www.cnblogs.com/kickit/p/8808127.html
Copyright © 2020-2023  润新知