rt,今天 % 你赛 T4 是 HDU6071,正解是同余最短路,本人赛时拆了 7 种路径去解七元不等式过了,但是好像没有考虑 2 到 1,1→4 一直折返再回到 2 的情况。
自己试着造了几组 hack 发现造不出来,对拍 105 组没问题,难道说这个方法是正确的?还是数据太水了?求正确性证明,或者 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;
}