求助关于算法正确性
  • 板块学术版
  • 楼主stripe_python
  • 当前回复5
  • 已保存回复7
  • 发布时间2025/7/21 13:48
  • 上次更新2025/7/21 18:06:24
查看原帖
求助关于算法正确性
928879
stripe_python楼主2025/7/21 13:48

rt,今天 % 你赛 T4 是 HDU6071,正解是同余最短路,本人赛时拆了 77 种路径去解七元不等式过了,但是好像没有考虑 2211141 \to 4 一直折返再回到 22 的情况。

自己试着造了几组 hack 发现造不出来,对拍 10510^5 组没问题,难道说这个方法是正确的?还是数据太水了?求正确性证明,或者 hack 数据。

#include <bits/stdc++.h>
using namespace std;

#ifdef SPN_LOCAL
#define debug(x) (cerr << boolalpha << "On Line " << __LINE__ << ": " << #x << " = " << (x) << endl)
#else
#define debug(x) ((void) 0)
#endif

#define int long long
int k, d[5], a[10];

int solve(vector<int> v) {
	int g = 0, tot = 0;
	for (int i : v) g = __gcd(g, i), tot += i;
	int r = max(tot, k), a = r / g;
	if (a * g < r) a++;
	return a * g;
}

void _main() {
	cin >> k >> d[1] >> d[2] >> d[3] >> d[4];
	a[1] = d[1] + d[2] + d[3] + d[4];   // 走完环 
	a[2] = 2 * d[1];  // 2->1 折返
	a[3] = 2 * (d[1] + d[4]);  // 2->1->4 折返
	a[4] = 2 * (d[1] + d[4] + d[3]);  // 2->1->4->3 折返
	a[5] = 2 * d[2];   // 2->3 折返
	a[6] = 2 * (d[2] + d[3]);   // 2->3->4 折返
	a[7] = 2 * (d[2] + d[3] + d[4]);  // 2->3->4->1 折返
	sort(a + 1, a + 8);
	
	int res = LLONG_MAX;
	for (int i = 1; i < 128; i++) {
		vector<int> v;
		for (int j = 1; j <= 7; j++) {
			if (i >> (j - 1) & 1) v.emplace_back(a[j]);
		}
		res = min(res, solve(v));
	} cout << res;
} signed main() { 
	ios::sync_with_stdio(false);
	cin.tie(nullptr), cout.tie(nullptr);
	
	int t = 1; for (/*cin >> t*/; t--; ) _main();
	return 0;
}
2025/7/21 13:48
加载中...