任务
1 #include <bits/stdc++.h> 2 using namespace std; 3 typedef long long ll; 4 typedef pair<int, int> PII; 5 const int N = 100010; 6 int n, m; 7 PII mchs[N], tasks[N]; 8 //存储机器,存储任务 9 int main() { 10 while (cin >> n >> m) { //多组输入 11 for (int i = 0; i < n; i++) { 12 cin >> mchs[i].first >> mchs[i].second; 13 } 14 for (int i = 0; i < m; i++) { 15 cin >> tasks[i].first >> tasks[i].second; 16 } 17 sort(mchs, mchs + n); //从小到大排序 18 sort(tasks, tasks + m); //从小到大排序 19 multiset<int> ys; //存储所有y 20 /* 21 multiset是<set>库中一个非常有用的类型, 22 它可以看成一个序列,插入一个数,删除一个数都能够在O(logn)的时间内完成 23 而且能时刻保证序列中的数是有序的,而且序列中可以存在重复的数。 24 */ 25 ll cnt = 0, res = 0; 26 //i枚举任务,j枚举机器 27 for (int i = m - 1, j = n - 1; i >= 0; i--) { 28 //每次把横坐标大于等于当前任务的机器都加进来 29 while (j >= 0 && mchs[j].first >= tasks[i].first) { 30 ys.insert(mchs[j].second); 31 j--; 32 } 33 multiset<int>::iterator it = ys.lower_bound(tasks[i].second); 34 if (it != ys.end()) { 35 cnt++; 36 res += 500 * tasks[i].first + 2 * tasks[i].second; 37 ys.erase(it); //用掉了一个机器 38 } 39 } 40 cout << cnt << " " << res << endl; 41 } 42 return 0; 43 }