My solution is O(N^2), but up to 83*99 iterations.
skidesign.cpp
#include <iostream> #include <fstream> using namespace std; // because lookup is faster than computing short square_table[] = { 0, 1, 4, 9, 16, 25, 36, 49, 64, 81, 100, 121, 144, 169, 196, 225, 256, 289, 324, 361, 400, 441, 484, 529, 576, 625, 676, 729, 784, 841, 900, 961, 1024, 1089, 1156, 1225, 1296, 1369, 1444, 1521, 1600, 1681, 1764, 1849, 1936, 2025, 2116, 2209, 2304, 2401, 2500, 2601, 2704, 2809, 2916, 3025, 3136, 3249, 3364, 3481, 3600, 3721, 3844, 3969, 4096, 4225, 4356, 4489, 4624, 4761, 4900, 5041, 5184, 5329, 5476, 5625, 5776, 5929, 6084, 6241, 6400, 6561, 6724, 6889, 7056, 7225, 7396, 7569, 7744, 7921, 8100, 8281, 8464, 8649, 8836, 9025, 9216, 9409, 9604, 9801, 10000 }; int main() { ofstream fout ("skidesign.out"); ifstream fin ("skidesign.in"); // Read input short N; // [1, 1000] fin >> N; short hills_at_elevation[101] = {0}; short min = 100, max = 0; for(short i = 0; i < N; ++i){ short H; // [0, 100] fin >> H; // Add hill to counter ++hills_at_elevation[H]; // Check min/max if(H < min) min = H; if(H > max) max = H; } // Calculate output if(max <= 17 + min) // max - min <= 17 fout << 0 << endl; // Special case: no adjustment is needed else{ int best_price = 3444500; // 500 * (100 - 0 - 17) ^ 2 -- only half of 1000 will be adjusted by 83 short low = min, high = min + 17, low_max = max - 17; for(short low = min; low <= low_max; ++low, ++high){ // up to O(N) but no more than 83 int price = 0; // Add cost below this part for(char i = low - 1; i >= 0; --i) // up to O(N^2) but no more than 83 if(hills_at_elevation[i]) price += hills_at_elevation[i] * square_table[low - i]; // Add cost above this part for(char i = high + 1; i <= 100; ++i) // up to O(N^2) but no more than 83 if(hills_at_elevation[i]) price += hills_at_elevation[i] * square_table[i - high]; // Check if it is the best price if(price < best_price) best_price = price; } // O(N^2) but no more than 83 * (83 + 83) = 13778 fout << best_price << endl; } return 0; }
No comments:
Post a Comment