#include #include // #include //#include using namespace std; int N; const int MAX_N = 10000; const int MAX_VAL = 100000; const int offset = 50000; int rawNum[MAX_VAL]; int num[MAX_N]; int delta[MAX_N-1][3]; int freeNum; int MIN_FREENUM; int minK; int notepad[MAX_N][MAX_N]; void minCost(int i, int k); int main() { /*for(int i = 0; i < MAX_N; i++) for(int j = 0; j < MAX_N; j++) notepad[i][j] = -1;*/ for(int i = 0; i < MAX_VAL; i++) rawNum[i] = 0; for(int i = 0; i < MAX_N-1; i++) delta[i][0] = 0; ifstream fin("input.txt"); fin >> N; freeNum = N; MIN_FREENUM = N / 3; int v; for(int i = 0; i < N; i++) { fin >> v; rawNum[v+offset]++; } fin.close(); // ordino l'input int x = 0; for(int i = 0; i < N; i++) { while(rawNum[x] == 0 && x < MAX_VAL) x++; num[i] = x-offset; rawNum[x]--; if(i > 0) { delta[i-1][1] = num[i]; delta[i-1][2] = num[i-1]; delta[i-1][0] = delta[i-1][1] - delta[i-1][2]; } } for(int i = 0; i < N; i++) rawNum[num[i]+offset]++; minK = 999999; int nStart = N-2; // update rawNum[delta[nStart][1] + offset]--; rawNum[delta[nStart][2] + offset]--; freeNum -= 2; minCost(nStart, delta[nStart][0] * delta[nStart][0]); //cout << minK << "\n"; ofstream fout("output.txt"); fout << minK << "\n"; fout.close(); return 0; } void minCost(int i, int k) { /*if(notepad[i][k] != -1) { if(notepad[i][k] < minK) minK = notepad[i][k]; return; }*/ if(freeNum <= MIN_FREENUM) { if(k < minK) { bool check = true; for(int x = MIN_FREENUM; x < N-1; x++) { int a1 = rawNum[num[x]+offset]; int a2 = rawNum[num[x+1]+offset]; if( (num[x] == num[x+1] && a1 == 2) || (num[x] != num[x+1] && a1 >= 1 && a2 >= 1) ) { check = false; break; } } if(check) notepad[i][k] = minK = k; } return; } if(i < 1) return; int m1; int c = delta[i][1]+offset; int b = delta[i][2]+offset; if( (b != c && rawNum[b] > 0 && rawNum[c] > 0) || (b == c && rawNum[b] >= 2) ) { int ki = delta[i][0] * delta[i][0]; // update rawNum[b]--; rawNum[c]--; freeNum -= 2; minCost(i - 1, k + ki); // update rawNum[b]++; rawNum[c]++; freeNum += 2; } minCost(i - 1, k); }