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

    题目大意:输入整数t,表示有t个测试样例。每个测试样例输入m和q,分别代表共有m个人和q个查询。接着有m行,每行代表一个人的信息,分别是id、年薪、身高。定义A的直接老板指的是m个人中,年薪比A大的且身高不低于A的身高人中年薪最低的人。定义A的下属是包括A的下属和A的下属的下属。接着q个查询每次输入一个id,查询该人的直接老板和下属的数量。

    解题思路:排序递推。结构体Person包括id,salary,high属性。对年薪进行从小到大的排序,在目标id右侧找直接老板,在目标左边找下属数量。注意:从目标id往左,只要遇到身高高于目标id的身高就不能继续往左,因为此时更左侧的不是目标id的下属。

    代码如下:

     1 #include <iostream>
     2 #include <algorithm>
     3 #include <vector>
     4 #include <map>
     5 using namespace std;
     6 
     7 struct Person {
     8     int id;
     9     int salary;
    10     int high;
    11     Person(int id_ = 0, int salary_ = 0, int high_ = 0) {
    12         id = id_;
    13         salary = salary_;
    14         high = high_;
    15     }
    16     bool operator<(const Person &other) const {
    17         if (salary < other.salary) {
    18             return true;
    19         } else {
    20             return false;
    21         }
    22     }
    23 };
    24 
    25 
    26 int main() {
    27     int t;
    28     cin >> t;
    29     while (t--) {
    30         int m, q;
    31         cin >> m >> q;
    32         vector<Person> persons;
    33         map<int, pair<int, int> > mp;
    34         int id, salary, high;
    35         for (int i = 0; i < m; i++) {
    36             cin >> id >> salary >> high;
    37             persons.push_back(Person(id, salary, high));
    38             mp[id] = pair<int, int>(salary, high);
    39         }
    40 
    41         sort(persons.begin(), persons.end());
    42 
    43         for (int i = 0; i < q; i++) {
    44             cin >> id;
    45             pair<int, int> p = mp[id];
    46             salary = p.first;
    47             high = p.second;
    48 
    49             // 二分查找  在当前根据salary排序完的队列中用二分查找,找到目标salary
    50             // 然后递推查找直系boss和下属的数量
    51 
    52             int begin = 0;
    53             int end = m;
    54             while (begin + 1 != end) {
    55                 int mid = (begin + end) / 2;
    56                 if (salary < persons[mid].salary) {
    57                     end = mid;
    58                 } else {
    59                     begin = mid;
    60                 }
    61             }
    62 
    63             int subordinate = 0;
    64             // begin 即 salary 对应的 person
    65             for (int i = begin-1; i >= 0; i--) {
    66                 if (persons[i].high > high) break;
    67                 subordinate++;
    68             }
    69 
    70             int immediateBoss = 0;
    71             for (int i = begin + 1; i < m; i++) {
    72                 if (persons[i].salary > salary && persons[i].high >= high) {
    73                     immediateBoss = persons[i].id;
    74                     break;
    75                 }
    76             }
    77 
    78             cout << immediateBoss << " " << subordinate << endl;
    79 
    80         }
    81 
    82     }
    83 
    84     return 0;
    85 }
  • 相关阅读:
    Android NDK学习(1) 简介
    wmsys.wm_concat结果长度限制的问题
    onInterceptTouchEvent和onTouchEvent调用时序
    滑动到底部或顶部响应的ScrollView实现
    Android ViewPager使用详解
    android include标签的使用,在RelativeLayout中使用include标签需注意!!!!!
    Eclipse中如何在指定工程中搜索指定的字符串
    android:windowSoftInputMode属性详解
    cocos2d-x中关于touch事件的响应
    《从零开始学Swift》学习笔记(Day 6)——哎呀常量和变量都该什么时候用啊?
  • 原文地址:https://www.cnblogs.com/mchcylh/p/4873274.html
Copyright © 2011-2022 走看看