Untitled
unknown
plain_text
2 years ago
1.8 kB
8
Indexable
#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;
}Editor is loading...