逆天RE,求调
查看原帖
逆天RE,求调
1382496
myl_coder楼主2025/8/1 21:44
#include <bits/stdc++.h>
using namespace std;

#define int long long

int T, x, y, k, a[110], dp[110][2];
vector <int> num;

void solve () {
	if (num[0]) dp[0][1] = dp[0][0] = a[0];
	else dp[0][0] = 0;
	for (int i = 1; i < num.size(); i ++) {
		if (num[i]) {
			dp[i][0] = dp[i - 1][0] + a[i];
			dp[i][1] = min(dp[i - 1][0] + a[i], dp[i - 1][1]);
		} else {
			dp[i][0] = min(dp[i - 1][0], dp[i - 1][1] + a[i]);
			dp[i][1] = dp[i - 1][1] + a[i];
		}
	}
	cout << min(dp[num.size() - 1][0], a[num.size()] + dp[num.size() - 1][1]) << "\n";
}

signed main() {
	ios :: sync_with_stdio(0);
	cin.tie(0);
	cout.tie(0);

	//freopen (".in", "r", stdin);
	//freopen (".out", "w", stdout);

	cin >> T;
	while (T --) {
		num.clear();
		memset(dp, 0x3f, sizeof(dp));
		memset(a, 0, sizeof(a));
		cin >> x >> y >> k;
		if (x > y) swap(x, y);
		if (x == y) {
			cout << 0 << "\n";
			continue;
		}
		for (int i = 0; i <= k; i ++) {
			cin >> a[i];
		}
		int tx = y - x;
		while (tx) {
			num.push_back(tx % 2);
			tx >>= 1ll;
		}
		for (int i = 1; i <= k; i ++) a[i] = min(a[i], a[i - 1] << 1ll);
		for (int i = k + 1; i <= num.size(); i ++) a[i] = a[i - 1] << 1ll;
		solve ();
	}

	return 0;
}
2025/8/1 21:44
加载中...