sicily 1063. Who's the Boss 排序+递推
1 #include <cstdio> 2 #include <algorithm> 3 using namespace std; 4 struct Emp{ 5 int id, salary, height, boss, sub; 6 Emp(int i=0, int s=0, int h=0, int b=0, int sb=0) : 7 id(i), salary(s), height(h), boss(b), sub(sb) {} 8 } emp[30000]; 9 bool cmp(Emp a, Emp b) { 10 return a.salary < b.salary; 11 } 12 int main() { 13 int t; 14 scanf("%d", &t); 15 while (t--) { 16 int m, q; 17 scanf("%d%d", &m, &q); 18 for (int i = 0; i < m; i++) { 19 int id, sal, hei; 20 scanf("%d%d%d", &id, &sal, &hei); 21 emp[i] = Emp(id, sal, hei); // Boss id 与 subordinate 默认为 0 22 } 23 // 按薪水升序排序 24 sort(emp, emp+m, cmp); 25 // 找直属上司,计算下属数量 26 for (int i = 0; i < m-1; i++) { 27 // 直属上司在数组中对应的下标 boss 28 int boss = -1; 29 for (int j = i+1; j < m; j++) 30 if (emp[j].height >= emp[i].height) { 31 boss = j; 32 break; 33 } 34 if (boss != -1) { 35 emp[i].boss = emp[boss].id; 36 emp[boss].sub += emp[i].sub + 1; 37 } 38 } 39 for (int i = 0; i < q; i++) { 40 int query; 41 scanf("%d", &query); 42 int j, index = m-1; 43 for (j = 0; j < m; j++) // 找到要查询的对象对应的下标 index 44 if (emp[j].id == query) { 45 index = j; 46 break; 47 } 48 printf("%d %d\n", emp[index].boss, emp[index].sub); 49 } 50 } 51 }