Lazy Running Posted on 2019-06-26 | In acm , 做题记录 , 2017杭电多校赛 题目链接同余最短路12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788#include <bits/stdc++.h>using namespace std;typedef long long ll;typedef pair<int, ll> P;const ll MAX = 1e18;struct POINT{ int dis; int id;} a[10][5];ll d[5][60050];void djs(int st, ll m){ priority_queue<P, vector<P>, greater<P> > q; q.push(P(2, 0)); while (!q.empty()) { P now = q.top(); q.pop(); ll dis1 = now.second; int u = now.first; if(dis1>d[u][dis1%m]) continue; for (int i = 0; i < 2; i++) { ll dis2 = a[u][i].dis + d[u][dis1 % m]; if (dis2 < d[a[u][i].id][dis2 % m]) { d[a[u][i].id][dis2 % m] = dis2; q.push(P(a[u][i].id, dis2)); } } }}template<class T>void read(T& ret){ ret = 0; char c; while ((c = getchar()) > '9' || c < '0'); while (c <= '9' && c >= '0') { ret = ret * 10 + c - '0'; c = getchar(); }}int main(){ int T; read(T); while (T--) { ll k; ll ans = MAX; int d1, d2, d3, d4; read(k), read(d1), read(d2), read(d3), read(d4); a[1][0].dis = d1, a[1][0].id = 2; a[1][1].dis = d4, a[1][1].id = 4; a[2][0].dis = d2, a[2][0].id = 3; a[2][1].dis = d1, a[2][1].id = 1; a[3][0].dis = d3, a[3][0].id = 4; a[3][1].dis = d2, a[3][1].id = 2; a[4][0].dis = d4, a[4][0].id = 1; a[4][1].dis = d3, a[4][1].id = 3; ll m = min(d1, d2) * 2; for (int i = 0; i < 5; i++) for (int j = 0; j <= m; j++) d[i][j] = MAX; d[2][0] = 0; djs(2, m); for (int i = 0; i < m; i++) { if (d[2][i] < k) { ll yu = k - d[2][i], cx; if (yu % m) cx = (yu / m) + 1; else cx = yu / m; ans = min(ans, d[2][i] + cx * m); } else ans = min(ans, d[2][i]); } printf("%lld\n", ans); }}