zoukankan      html  css  js  c++  java
  • [HDOJ5360]Hiking

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=5360

    优先队列+贪心。(感觉这个贪心在《挑战程序设计竞赛》一书中有个类似的,有兴趣的可以找一下。)

    写优先队列优先级判断的时候把maxx写成minn也是醉了,调了2个小时才发现。看来应该再仔细一些啊。

    初始化将下限小于当前人数的人全部压入队列中,再判断要求上限和当前人数是否符合,如果符合,则当前去的人数+1,此人出队。同时记下顺序。接着将下限符合条件的压入队列。

     1 #include <cstdio>
     2 #include <cstdlib>
     3 #include <cstring>
     4 #include <algorithm>
     5 #include <iostream>
     6 #include <cmath>
     7 #include <cctype>
     8 #include <queue>
     9 #include <map>
    10 #include <set>
    11 #include <stack>
    12 #include <list>
    13 #include <vector>
    14 
    15 using namespace std;
    16 
    17 
    18 typedef struct Node {
    19     int maxx;
    20     int minn;
    21     int id;
    22     friend bool operator <(Node a, Node b) {
    23         return a.maxx > b.maxx;
    24     }
    25 }Node;
    26 
    27 bool cmp(Node a, Node b) {
    28     return a.minn < b.minn;
    29 }
    30 
    31 const int maxn = 1000010;
    32 Node peo[maxn];
    33 priority_queue<Node> pq;
    34 int ord[maxn];
    35 int n;
    36 
    37 int main() {
    38     // freopen("in", "r", stdin);
    39     int T;
    40     scanf("%d", &T);
    41     while(T--) {
    42         int cnt = 0;
    43         while(!pq.empty()) {
    44             pq.pop();
    45         }
    46         scanf("%d", &n);
    47         for(int i = 1; i <= n; i++) {
    48             scanf("%d", &peo[i].minn);
    49             peo[i].id = i;
    50         }
    51         for(int i = 1; i <= n; i++) {
    52             scanf("%d", &peo[i].maxx);
    53         }
    54         sort(peo+1, peo+n+1, cmp);
    55         int cur = 0;    //当前有多少人去
    56         int k = 1;
    57         while(peo[k].minn <= cur) {   //init
    58                 pq.push(peo[k++]);
    59         }
    60         while(!pq.empty()) {
    61             if(pq.top().maxx >= cur) {
    62                 cur++;
    63             }
    64             ord[cnt++] = pq.top().id;
    65             pq.pop();
    66             while(peo[k].minn <= cur && k <= n) {
    67                 pq.push(peo[k++]);
    68             }
    69         }
    70         printf("%d
    ", cur);
    71         for(int i = 0; i < cnt; i++) {
    72             printf("%d ", ord[i]);
    73         }
    74         for(int i = k; i <= n; i++) {
    75             printf("%d ", peo[i].id);
    76         }
    77         printf("
    ");
    78     }
    79     return 0;
    80 }
  • 相关阅读:
    Python 最强 IDE 详细使用指南!-PyCharm
    Python中最常用的字符串方法!
    转:用 Python 一键分析你的上网行为, 看是在认真工作还是摸鱼
    python中hasattr()、getattr()、setattr()函数的使用
    下载图片到本地,保存字符串内容到本地
    根据经纬度算出两个位置之间的距离
    根据日期获取星座和生肖
    java去除字符串的html标签
    java环信服务端注册IM代码
    linux命令
  • 原文地址:https://www.cnblogs.com/kirai/p/4781944.html
Copyright © 2011-2022 走看看