Untitled
plain_text
a month ago
1.8 kB
1
Indexable
Never
#include<iostream> using namespace std; const int MaxL = 65; int TC, N, vt[3], l[3], tau[MaxL], sum, mind; int a[6][3] = {{0, 1, 2},{0, 2, 1},{1, 0, 2},{1, 2, 0},{2, 0, 1},{2, 1, 0}}; void doing(int k, int stt, int id, int d) { if(d >= mind) return; if(k == sum) { if(d < mind) mind = d; return; } int index = vt[a[id][stt]] - 1; int tmp = k + 1; for(int i = stt - 1; i >= 0; i--) tmp -= l[a[id][i]]; int newstt = tmp == l[a[id][stt]] ? stt + 1 : stt; if(tau[index] == 0) { tau[index] = 1; doing(k + 1, newstt, id, d + 1); tau[index] = 0; } else { int le = index - 1, ri = index + 1; while(tau[le] != 0 && le >= 0) le--; while(tau[ri] != 0 && ri < N) ri++; if(le != -1 && ri != N) { if(index - le == ri - index && newstt == stt + 1) { tau[le] = 1; doing(k + 1, newstt, id, d + (index - le + 1)); tau[le] = 0; tau[ri] = 1; doing(k + 1, newstt, id, d + (ri - index + 1)); tau[ri] = 0; } else { int tmpi = index - le < ri - index ? le : ri; int tmpd = index - le < ri - index ? index - le + 1 : ri - index + 1; tau[tmpi] = 1; doing(k + 1, newstt, id, d + tmpd); tau[tmpi] = 0; } } else if(le != -1) { tau[le] = 1; doing(k + 1, newstt, id, d + (index - le + 1)); tau[le] = 0; } else if(ri != N) { tau[ri] = 1; doing(k + 1, newstt, id, d + (ri - index + 1)); tau[ri] = 0; } } } int main() { freopen("input.txt", "r", stdin); cin >> TC; for(int tc = 0; tc < TC; tc++) { cin >> N; mind = 2147483646; for(int i = 0; i < 3; i++) cin >> vt[i] >> l[i]; fill_n(tau, N, 0); sum = l[0] + l[1] + l[2]; for(int i = 0; i < 6; i++) doing(0, 0, i, 0); cout << "Case #" << tc + 1 << endl << mind << endl; } return 0; }