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 }

 

posted @ 2015-10-12 23:32  MchCyLh  阅读(172)  评论(0编辑  收藏  举报