Upon review, I beat the solution! Though N is no larger than 100, my solution runs in O(1) time and theirs runs in O(N^3) time.
combo2.cpp
#include <iostream> #include <fstream> #define loopi(x) loop_start(i,x,0) #define loopj(x) loop_start(j,x,0) #define loop_start(i, x,s) for(int i = (s); i < (x); ++i) #define loop_rev(a,x,stop) for(int a = (x); a >= (stop); --a) using namespace std; int N; int fixrange(int n){ --n; while(n < 0) n += N; return (n % N) + 1; } int overlap(int a, int b){ // I tried with modular arithmetic but couldn't get it working // return 5 - min(abs(a - b) % N, N - (abs(a - b) % N)); int a1 = fixrange(a - 2), a2 = fixrange(a - 1), a3 = a, a4 = fixrange(a + 1), a5 = fixrange(a + 2); int b1 = fixrange(b - 2), b2 = fixrange(b - 1), b3 = b, b4 = fixrange(b + 1), b5 = fixrange(b + 2); int total = 0; if(a1 == b1 || a1 == b2 || a1 == b3 || a1 == b4 || a1 == b5) ++total; if(a2 == b1 || a2 == b2 || a2 == b3 || a2 == b4 || a2 == b5) ++total; if(a3 == b1 || a3 == b2 || a3 == b3 || a3 == b4 || a3 == b5) ++total; if(a4 == b1 || a4 == b2 || a4 == b3 || a4 == b4 || a4 == b5) ++total; if(a5 == b1 || a5 == b2 || a5 == b3 || a5 == b4 || a5 == b5) ++total; return total; } #define NUMCOMBO 3 int main() { ofstream fout ("combo.out"); ifstream fin ("combo.in"); // get input int combo1[NUMCOMBO]; int combo2[NUMCOMBO]; fin >> N; loopi(NUMCOMBO) fin >> combo1[i]; loopi(NUMCOMBO) fin >> combo2[i]; // calculate: // Special case: there is always N overlap if N <= 5 if(N <= 5) // 2 * N ** 3 - N ** 3 = N ** 3 // write output fout << (N * N * N); else{ int overlap_a = overlap(combo1[0], combo2[0]); int overlap_b = overlap_a ? overlap(combo1[1], combo2[1]) : 0; int overlap_c = overlap_b ? overlap(combo1[2], combo2[2]) : 0; // 2 * 5 ** 3, but subtract the overlap // write output fout << (250 - overlap_a * overlap_b * overlap_c); } return 0; }
No comments:
Post a Comment