0
点赞
收藏
分享

微信扫一扫

cf782 C. Line Empire

小时候是个乖乖 2022-04-25 阅读 198
算法
//https://codeforces.com/contest/1659/problem/C

//做这道题的时候脑子确实瓦特了,贪心只想了一半规模:Xa(首都的位置), Xb(已占领), Xc(未占领),是否选择直接占领Xc,还是迁都到Xb再占领Xc。
//但是这样后面的结果会不一样,贪心失败了。
//看了题解,人家题解直接总结成两部分开始解决,看了人家的博客才知道贪心只想了一半规模。
//好像贪心的对象也不同,我原来贪心的对象为Xc,但贪心的对象应该是 是否迁都到Xb。
// Xa(首都), Xb(已占领),   Xc(未占领)...Xn(未占领) ,是在Xa占领后面所有的Xi,还是在迁都Xb之后在占领后面所有的Xi。
//两个情况:b * (Xc - Xa) + b * (Xd - Xa) + ... + (Xn - Xa);  a * (Xb - Xa) + b * (Xc - Xb) + b * (Xd - Xb) + ... + b * (Xn - Xb)。
//因为(Xc - Xa) = (Xc - Xb) + (Xb - Xa);
//所以两者化简一下为 :  K * b * (Xb - Xa); a * (Xb - Xa)。 (K为Xb后面还有几个数)
//最后再化简一下 :      K * b; a。
//如果a小,则迁都再判断下一个即可。 
#include<iostream>
using namespace std;

typedef long long ll;
const int maxn = 2e5 + 10;
ll x[maxn];

int main() {
	int T;
	cin >> T;
	while(T--) {
		ll n, a, b, ans = 0;
		cin >> n >> a >> b;
		for(int i = 1; i <= n; i++) cin >> x[i];
		int c1 = 0;
		for(int i = 1; i <= n; i++) {
			ans += b * (x[i] - x[c1]);
			if((n - i) * b > a) {
				ans += a * (x[i] - x[c1]);
				c1 = i;
			}
		}
		cout << ans << "\n";
	}
}
举报

相关推荐

0 条评论