题目描述
为了找到自己满意的工作,牛牛收集了每种工作的难度和报酬。牛牛选工作的标准是在难度不超过自身能力值的情况下,牛牛选择报酬最高的工作。在牛牛选定了自己的工作后,牛牛的小伙伴们来找牛牛帮忙选工作,牛牛依然使用自己的标准来帮助小伙伴们。牛牛的小伙伴太多了,于是他只好把这个任务交给了你。
输入描述:
每个输入包含一个测试用例。
每个测试用例的第一行包含两个正整数,分别表示工作的数量N(N<=100000)和小伙伴的数量M(M<=100000)。
接下来的N行每行包含两个正整数,分别表示该项工作的难度Di(Di<=1000000000)和报酬Pi(Pi<=1000000000)。
接下来的一行包含M个正整数,分别表示M个小伙伴的能力值Ai(Ai<=1000000000)。
保证不存在两项工作的报酬相同。
输出描述:
对于每个小伙伴,在单独的一行输出一个正整数表示他能得到的最高报酬。一个工作可以被多个人选择。
示例1
输出
复制100 1000 1001
AC代码:
1 #include <bits/stdc++.h> 2 using namespace std; 3 4 #define N 100001 + 10 5 6 struct job 7 { 8 int difficulty; // 难度 9 int salary; // 报酬 10 } jb[N]; 11 struct person 12 { 13 int ability; // 能力 14 int i; // 对应编号 15 int salary = 0; // 报酬 16 } pesn[N]; 17 18 bool cmp(job jb1, job jb2) // 根据难度从小到大排序 19 { 20 return jb1.difficulty < jb2.difficulty; 21 } 22 bool cmp1(person ps1, person ps2) // 根据能力从小到大排序 23 { 24 return ps1.ability < ps2.ability; 25 } 26 bool cmp2(person ps1, person ps2) // 根据编号从小到大排序 27 { 28 return ps1.i < ps2.i; 29 } 30 int main() 31 { 32 int n, m; 33 while (scanf("%d%d", &n, &m) != EOF) 34 { 35 for (int i = 0; i < n; i++) 36 cin >> jb[i].difficulty >> jb[i].salary; 37 sort(jb, jb + n, cmp); 38 for (int i = 0; i < m; i++) 39 { 40 pesn[i].i = i; 41 cin >> pesn[i].ability; 42 } 43 sort(pesn, pesn + m, cmp1); 44 // maxmoney中存放到j的最大值 45 int j = 0; 46 int maxmoney = 0; 47 for (int i = 0; i < m; i++) 48 { 49 while (j < n) 50 { 51 if (jb[j].difficulty > pesn[i].ability) 52 break; 53 maxmoney = max(maxmoney, jb[j].salary); 54 j++; 55 } 56 pesn[i].salary = maxmoney; 57 } 58 sort(pesn, pesn + m, cmp2); 59 for (int i = 0; i < m; i++) 60 cout << pesn[i].salary << endl; 61 } 62 return 0; 63 }