• HDU1434 幸福列车【模拟+优先队列】


    幸福列车

    Time Limit: 20000/10000 MS (Java/Others)    Memory Limit: 131070/65535 K (Java/Others)
    Total Submission(s): 2690    Accepted Submission(s): 891

    Problem Description
    一批幸福的列车即将从杭州驶向幸福的终点站——温州,身为总列车长的linle有一些奇怪的癖好。

    他会记录下全部乘客的名字(name)和他们的人品值(RP),根据这些将他们排序,并不时地从某辆列车里踢出人品最不好(RP值最低)的一个人,当两个人人品一样不好时,他就会踢出名字难听的人(linle认为按字典顺序,排在越在后面的人名字越难听)。

    当然出于列车行驶需要,他还会不时的发布一些命令,比如让某个乘客上车,合并某两辆列车等。

    linle的上一任秘书***因为不能高效地执行他的这些命令而被炒鱿鱼,他现在正在寻觅新的秘书人选,你能不能胜任呢?(谢绝男士,待遇丰厚~~~)
    Input
    本题包含多组测试,请处理到文件结束。
    对于每一组测试,第一行包含两个整数 N ,M ,表示一共有N( N<=10000 ) 辆列车,执行M( M<=10000 )次操作。
    接下来有 N (从1开始记数)辆列车的信息,每辆列车先有一个数字 Xi(1 <= Xi <= 100 ),表示该列车有Xi个乘客,接下来Xi行乘客信息,每个乘客包含名字(20个字符以内,不包含空白符)和人品(0<= RP <=30000)。
    再接下来有 M 行操作信息,一共有3种操作,分别为

    GETON Xi name RP 表示有一个叫name的人品为RP的人登上第Xi列车

    JOIN Xi Xj 表示有将第Xj辆列车合并到Xi辆列车

    GETOUT Xi 表示从第Xi辆列车踢出一个人品最差的人

    测试数据保证每个操作均合法,即不会将已经被合并到其他列车的列车再进行合并,也不会从一辆空列车里踢出乘客
    Output
    对于每个 GETOUT 命令,输出被踢出的那个人的名字
    Sample Input
    3 5 2 xhd 0 zl 1 2 8600 1 ll 2 1 Ignatius 3 GETOUT 1 JOIN 1 2 GETOUT 1 GETON 3 hoho 2 GETOUT 3
    Sample Output
    xhd zl hoho
    Hint
    Huge input, scanf is recommended.
    Author
    linle
    Source

    问题链接HDU1434 幸福列车

    问题简述参见上文。

    问题分析

    这个问题需要使用优先队列,以便让指定条件的乘客下车,不然算起来就复杂了。

    剩下的问题就是构建一个好的数据结构来表示问题,这里优先队列是最为合适的。

    对于输入的数据,将其放入优先队列中即可。

    然后就是模拟三种命令的操作。

    程序说明

    优先队列q[]的元素数量多一个(N+1)比较好,有关的操作就便利了。

    名字使用string类型的话,不论输入输出还是计算处理都是方便的。

    输入输出使用C++的方式是方便简洁的。

    为了使得输入输出速度与C语言一样快,使用了语句"std::ios::sync_with_stdio(false);"。

    题记:(略)

    参考链接:(略)


    AC的C++语言程序如下:

    /* HDU1434 幸福列车 */
    
    #include <iostream>
    #include <queue>
    
    using namespace std;
    
    const int N = 10000;
    
    struct _node {
        string name;
        int rp;
        friend bool operator < (_node a, _node b) {
            if(a.rp != b.rp)
                return a.rp > b.rp;
            else
                return a.name < b.name;
        }
    };
    
    int main()
    {
        std::ios::sync_with_stdio(false);
    
        int n, m, xi, xj;
    
        while(cin >> n >> m) {
            priority_queue<_node> q[N+1];
            _node t;
    
            for(int i=1; i<=n; i++) {
                cin >> xi;
                while(xi--) {
                    cin >> t.name >> t.rp;
    
                    q[i].push(t);
                }
            }
    
            while(m--) {
                string op;
    
                cin >> op;
                if(op == "GETON") {
                    cin >> xi >> t.name >> t.rp;
    
                    q[xi].push(t);
                } else if(op == "JOIN") {
                    cin >> xi >> xj;
                    while(!q[xj].empty()) {
                        t = q[xj].top();
                        q[xi].push(t);
                        q[xj].pop();
                    }
                } else if(op == "GETOUT") {
                    cin >> xi;
                    t = q[xi].top();
                    cout << t.name << endl;
                    q[xi].pop();
                }
            }
        }
    
        return 0;
    }




  • 相关阅读:
    接口问题
    鉴权 授权 验签
    adb常用命令
    cookie session
    常见http返回状态码
    Linux下mysql数据库的命令
    Linux课堂笔记--第九天
    Linux课堂随笔 -第八天
    Linux课堂笔记-第七天
    Linux课堂随笔-第六天
  • 原文地址:https://www.cnblogs.com/tigerisland/p/7563579.html
Copyright © 2020-2023  润新知