大佬帮忙看看
查看原帖
大佬帮忙看看
782728
gilig1225楼主2024/12/12 18:15

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; 
} 
2024/12/12 18:15
加载中...