zoukankan      html  css  js  c++  java
  • sicily 1063. Who's the Boss

    Time Limit: 1sec    Memory Limit:32MB 
    Description
    Several surveys indicate that the taller you are, the higher you can climb the corporate ladder. At TALL Enterprises Inc. this "de facto standard" has been properly formalized: your boss is always at least as tall as you are. Furthermore, you can safely assume that your boss earns a bit more than you do. In fact, you can be absolutely sure that your immediate boss is the person who earns the least among all the employees that earn more than you and are at least as tall as you are. Furthermore, if you are the immediate boss of someone, that person is your subordinate, and all his subordinates are your subordinates as well. If you are nobody's boss, then you have no subordinates. As simple as these rules are, many people working for TALL are unsure of to whom they should be turning in their weekly progress report and how many subordinates they have. Write a program that will help in determining for any employee who the immediate boss of that employee is and how many subordinates they have. Quality Assurance at TALL have devised a series of tests to ensure that your program is correct. These test are described below. 
    Input

    On the first line of the input is a single positive integer n, telling the number of test scenarios to follow. Each scenario begins with a line containing two positive integers m and q, where m (at most 30000) is the number of employees and q (at most 200) is the number of queries. The following m lines each list an employee by three integers on the same line: employee ID number (six decimal digits, the first one of which is not zero), yearly salary in Euros and finally height in m (1 microm= 10^-6 meters - accuracy is important at TALL). The chairperson is the employee that earns more than anyone else and is also the tallest person in the company. Then there are q lines listing queries. Each query is a single legal employee ID.

    The salary is a positive integer which is at most 10 000 000. No two employees have the same ID, and no two employees have the same salary. The height of an employee is at least 1 000 000 microm and at most 2 500 000 microm.

    Output
    For each employee ID x in a query output a single line with two integers y k, separated by one space character, where y is the ID of x's boss, and k is the number of subordinates of x. If the query is the ID of the chairperson, then you should output 0 as the ID of his or her boss (since the chairperson has no immediate boss except, possibly, God). 
    Sample Input
     Copy sample input to clipboard 
    2
    3 3
    123456 14323 1700000
    123458 41412 1900000
    123457 15221 1800000
    123456
    123458
    123457
    4 4
    200002 12234 1832001
    200003 15002 1745201
    200004 18745 1883410
    200001 24834 1921313
    200004
    200002
    200003
    200001
    Sample Output
    123457 0
    0 2
    123458 1
    200001 2
    200004 0
    200004 0
    0 3
    #include <iostream>
    #include <algorithm>
    #include <cstdio>
    
    using namespace std;
    
    struct Info {
        Info(int i = 0, int s = 0, int h = 0): identify(i), salary(s), height(h), boss(0), subNum(0) { }
        int identify;
        int salary;
        int height;
        int boss;
        int subNum;
    }employeeInfo[30010];
    
    bool cmp (const Info &a, const Info &b) {
        return a.salary < b.salary;
    }
    
    // bool isBoss(const Info &a, const Info &b) {
    //     return a.height >= b.height;
    // }
    
    int main(int argc, char *argv[])
    {
        int n;
        int m, q;
        scanf("%d", &n);
        while (n--) {
            scanf("%d%d", &m, &q);
            int identify, salary, height;
            for (int i = 0; i != m; ++i) {
                scanf("%d%d%d", &identify, &salary, &height);
                employeeInfo[i] = Info(identify, salary, height);
            }
            sort(employeeInfo, employeeInfo + m, cmp);  // 根据薪水排序
    
            for (int i = 0; i != m - 1; i++) {
                for (int j = i + 1; j <= m - 1; j++) {
                    if (employeeInfo[j].height >= employeeInfo[i].height) {  // 本来这里是一个比较函数的,也即注释里面的 isBoss,但是这样就超时了。没想明白原因
                                                                             // 按照编译器的优化,这里编译器应该会将这个函数变为 inline 的,
                                                                             // 可能平台的编译器版本比较低吧,暂时没时间看 sicily 源码,下次看看...
                        employeeInfo[j].subNum++;
                        employeeInfo[i].boss = employeeInfo[j].identify;
                        employeeInfo[j].subNum += employeeInfo[i].subNum;  // 自己的下级数加上下级的下级数,就是总下级数
                        break;
                    }
                }
            }
            for (int i = 0; i != q; ++i) {
                scanf("%d", &identify);
                for (int j = 0; j != m; j++) {
                    if (employeeInfo[j].identify == identify) {
                        printf("%d %d
    ", employeeInfo[j].boss, employeeInfo[j].subNum);
                        break;
                    }
                }
            }
        }
    
        return 0;
    }
  • 相关阅读:
    10查询结果排序
    11汇总和分组数据
    09查询基础
    07修改数据
    08删除数据
    06插入数据
    PHP 判断数组是否为空的5大方法
    Mysql模糊查询like效率,以及更高效的写法
    经典面试题golang实现方式(一)
    php调用c语言编写的so动态库
  • 原文地址:https://www.cnblogs.com/xiezhw3/p/4008667.html
Copyright © 2011-2022 走看看