20分
7#及sub3部分测试点过不了
思路:
站点按位置从小到大排序
车次开往a城和b城的次数ai,bi相同则直接累加到答案ans
不同如 (ai 10) ( bi 7 ) :
则先把小的7 * x * 2累加到答案。
剩下的差值(3)则根据情况放到vector数组needa 或needb中,最后排序;
把needa分别根据数据大小贪心从靠近a的站点安排,needb同理。
#include<bits/stdc++.h>
using namespace std;
long long n, m, x, ai, bi, ans, pos;
struct node{
long long p;
long long c;
};
node point[100005];
bool cmp(node x, node y){
return x.p < y.p;
}
vector <long long> needa, needb;
int main(){
cin >> n >> m >> x;
for(int i = 1; i <= n; i++)
cin >> point[i].p >> point[i].c;
sort(point + 1, point + 1 + n, cmp); //站点从小到大排序
for(int i = 1; i <= m; i++){
cin >> ai >> bi;
if(ai == bi)
ans += x * 2; // 相同的话,站点选择无所谓
else{
ans += min(ai, bi) * x * 2; //不同的情况
if(ai > bi)
needa.push_back(ai - bi); //开往a的次数
else
needb.push_back(bi - ai); //开往b的次数
}
}
sort(needa.begin(), needa.end(), greater<int>());
sort(needb.begin(), needb.end(), less<int>());
pos = 1;
for(int i = 0; i < needa.size(); i++){ //需开往a的按次数多少,贪心安排在最靠近a的站点
ans += point[pos].p * 2 * needa[i];
point[pos].c--;
if(point[pos].c == 0)
pos++;
}
pos = n;
for(int i = needb.size() - 1; i >= 0; i--){ //需开往b的按次数多少,贪心安排在最靠近b的站点
ans += (x - point[pos].p) * 2 * needb[i];
point[pos].c--;
if(point[pos].c == 0)
pos--;
}
cout << ans << endl;
return 0;
}