题解
2026-09-06 14:59:47
发布于:重庆
4阅读
0回复
0点赞
求点赞(凑五十个)
#include <iostream>
#include <algorithm>
#include <vector>
using namespace std;
struct Truck {
long long a, b, d;
};
bool cmp_truck(const Truck &u, const Truck &v) {
return u.d > v.d;
}
int main() {
ios::sync_with_stdio(false);
cin.tie(nullptr);
int n, m, x;
cin >> n >> m >> x;
vector<pair<int, int>> stations(n); // (p, c)
for (int i = 0; i < n; i++) {
cin >> stations[i].first >> stations[i].second;
}
sort(stations.begin(), stations.end()); // 按位置从小到大
vector<Truck> trucks(m);
for (int i = 0; i < m; i++) {
cin >> trucks[i].a >> trucks[i].b;
trucks[i].d = trucks[i].a - trucks[i].b;
}
sort(trucks.begin(), trucks.end(), cmp_truck); // 按 d 降序
long long ans = 0;
int left = 0, right = n - 1;
for (int i = 0; i < m; i++) {
long long d = trucks[i].d;
if (d >= 0) {
// 从左边取最小的 p
while (left <= right && stations[left].second == 0) left++;
if (left > right) break;
ans += 2LL * stations[left].first * d;
stations[left].second--;
} else {
// 从右边取最大的 p
while (left <= right && stations[right].second == 0) right--;
if (left > right) break;
ans += 2LL * stations[right].first * d;
stations[right].second--;
}
// 加上常数 2 * b * x
ans += 2LL * trucks[i].b * x;
}
cout << ans << endl;
return 0;
}
这里空空如也




有帮助,赞一个