#include #include #include #include using namespace std; int Sum(const vector & sumTable, int pivot, int length) { //cerr << "sum " << length << " at " << pivot << endl; return sumTable[pivot+length-1] - ((pivot < 1) ? 0 : sumTable[pivot-1]); } int minAlign(int pivot, int length, const vector & sumTable) { //cerr << "align" << endl; int minCost = INT_MAX; for(int i = length; i--; ) minCost = min(minCost, Sum(sumTable, pivot - i, length)); return minCost; } int findPivot(const vector & costs, const vector & sumTable) { //cerr << "pivot" << endl; int numPockets = costs.size()/3; vector maxs(1,0); for(int i = numPockets; i--; ) { const int index = i + numPockets; if(costs[index] == costs[maxs[0]]) maxs.push_back(index); else if(costs[index] > costs[maxs[0]]) maxs = vector(1, costs[index]); } //cerr << "pivot2" << endl; if(maxs.size() == 1) return maxs[0]; else { int bestMax = maxs[0]; int bestCost = INT_MAX; for(int i = maxs.size(); i--; ) { int cost = minAlign(maxs[i], numPockets/2, sumTable); if(cost < bestCost) { bestMax = maxs[i]; bestCost = cost; } } return bestMax; } } int main(int, char**) { int numPockets; while(cin >> numPockets) { if(numPockets == 0) break; vector costs(numPockets * 3); vector sumTable(numPockets * 3, 0); for(int i = 0; i < numPockets; i++) { int cost; cin >> cost; costs[i] = costs[i+numPockets] = costs[i+numPockets*2] = cost; } sumTable[0] = costs[0]; for(int i = 1; i < sumTable.size(); i++) sumTable[i] = costs[i] + sumTable[i-1]; int pivot = findPivot(costs, sumTable); int betLength = numPockets/2; int totalCost = minAlign(pivot, betLength, sumTable) + Sum(sumTable, pivot + 1, betLength) + Sum(sumTable, pivot - betLength, betLength); cout << totalCost << endl; } return 0; }