#include <iostream>
#include <vector>
using namespace std;
//The number of different troops
const int TROOP_AMOUNT = 7;
//Not sure where you guys store this data but here
//are the training times for each troop (in seconds)
//note that the training times for the supply cart and the ballista are switched for simplicity
const int TRAINING_TIMES[7] = {35, 50, 150, 210, 300, 900, 960};
//Predicate function for the binary search
bool predicate(vector<int> troopsToTrain, int barracksNum, int time){
vector<int> barracks;
barracks.resize(barracksNum, 0);
for (int i = 0; i < barracksNum; i++){
for (int j = TROOP_AMOUNT-1; j >= 0; j--){
while (troopsToTrain[j] > 0 && barracks[i]+TRAINING_TIMES[j] <= time){
barracks[i] += TRAINING_TIMES[j];
troopsToTrain[j]--;
}
}
}
for (int i = 0; i < TROOP_AMOUNT; i++){
if (troopsToTrain[i] > 0){
return false;
}
}
return true;
}
//Function that returns an array of integers
//At index 0 : the amount of time it takes to retrain (in seconds)
//After index 0 : a -1 denotes the start of a new barracks
// each -1 is followed by troop "IDs"
// and the amount of that troop on that barrack
//troopsToTrain : stores the amount of each troop, the key being its "ID",
// for example, troopsToTrain[0] holds the amount of infantry that has to be retrained
//barracksNum : amount of barracks the player has
vector<int> retrainTroops(vector<int> troopsToTrain, int barracksNum){
//Array on which we are going to store the data
vector<int> trainingInfo;
//Note It should be TROOP_AMOUNT*barracksNum but i changed it so the chart works properly
trainingInfo.resize(1+ TROOP_AMOUNT*3 +barracksNum);
//Check if all troops are multiples of barracksNum
bool isMultiple = true;
for (int i = 0; i < troopsToTrain.size(); i++){
if (troopsToTrain[i]%barracksNum != 0){
isMultiple = false;
break;
}
}
//If they are, spread them evenly across all barracks
if (isMultiple){
for (int i = 0; i < barracksNum; i++){
trainingInfo[1 + i*(TROOP_AMOUNT+1)] = -1;
for (int j = 0; j < TROOP_AMOUNT; j++){
trainingInfo[1 + i*(TROOP_AMOUNT+1) + j+1] = troopsToTrain[j]/barracksNum;
trainingInfo[0] += troopsToTrain[j]/barracksNum * TRAINING_TIMES[j];
}
}
trainingInfo[0] /= barracksNum;
return trainingInfo;
}
//If not, use binary search
int left, right, mid;
int troopTotal;
troopTotal = 0;
right = 0;
for (int i = TROOP_AMOUNT-1; i >= 0; i--){
if (troopsToTrain[i] > 0){
left = TRAINING_TIMES[i];
}
right += TRAINING_TIMES[i]*troopsToTrain[i];
troopTotal += troopsToTrain[i];
}
mid = left+(right-left)/2;
mid -= mid%5;
bool tempPredicate, tempPredicate2;
tempPredicate = predicate(troopsToTrain, barracksNum, mid);
tempPredicate2 = predicate(troopsToTrain, barracksNum, mid-5);
while (!(tempPredicate && !tempPredicate2)){
if (tempPredicate){
right = mid;
}
else{
left = mid;
}
mid = left+(right-left)/2;
mid -= mid%5;
tempPredicate = predicate(troopsToTrain, barracksNum, mid);
tempPredicate2 = predicate(troopsToTrain, barracksNum, mid-5);
}
//Fill the array with data
trainingInfo[0] = mid;
vector<int> barracks;
barracks.resize(barracksNum, 0);
for (int i = 0; i < barracksNum; i++){
trainingInfo[1 + i*(TROOP_AMOUNT+1)] = -1;
for (int j = TROOP_AMOUNT-1; j >= 0; j--){
while (troopsToTrain[j] > 0 && barracks[i]+TRAINING_TIMES[j] <= mid){
barracks[i] += TRAINING_TIMES[j];
troopsToTrain[j]--;
trainingInfo[1 + i*(TROOP_AMOUNT+1) + j+1]++;
}
}
}
return trainingInfo;
}
void outputLine(){
cout << "|----------|-----|-----|-----|" << endl;
}
void outputChart(vector<int> trainingInfo){
outputLine();
cout << "| Barracks | 1 | 2 | 3 |" << endl;
outputLine();
cout << "| Infantry | " << trainingInfo[1+1] << " | " << trainingInfo[9+1] << " | " << trainingInfo[17+1] << " | " << endl;
outputLine();
cout << "| Archers | " << trainingInfo[1+2] << " | " << trainingInfo[9+2] << " | " << trainingInfo[17+2] << " | " << endl;
outputLine();
cout << "| Raiders | " << trainingInfo[1+3] << " | " << trainingInfo[9+3] << " | " << trainingInfo[17+3] << " | " << endl;
outputLine();
cout << "| Horsemen | " << trainingInfo[1+4] << " | " << trainingInfo[9+4] << " | " << trainingInfo[17+4] << " | " << endl;
outputLine();
cout << "| Miners | " << trainingInfo[1+5] << " | " << trainingInfo[9+5] << " | " << trainingInfo[17+5] << " | " << endl;
outputLine();
cout << "|SupplyCart| " << trainingInfo[1+6] << " | " << trainingInfo[9+6] << " | " << trainingInfo[17+6] << " | " << endl;
outputLine();
cout << "| Bombards | " << trainingInfo[1+7] << " | " << trainingInfo[9+7] << " | " << trainingInfo[17+7] << " | " << endl;
outputLine();
int time2 = 0;
int time3 = 0;
for (int a = 10; a < 17; a++){
time2 += TRAINING_TIMES[a-10]*trainingInfo[a];
}
for (int a = 18; a < 25; a++){
time3 += TRAINING_TIMES[a-18]*trainingInfo[a];
}
cout << "| Time | " << trainingInfo[0] << " | " << time2 << " | " << time3 << " | " << endl;
outputLine();
}
int main()
{
vector<int> troopsToTrain;
troopsToTrain.resize(TROOP_AMOUNT, 0);
int barracksNum;
cin >> barracksNum;
cin >> troopsToTrain[0];
cin >> troopsToTrain[1];
cin >> troopsToTrain[2];
cin >> troopsToTrain[3];
cin >> troopsToTrain[4];
cin >> troopsToTrain[5];
cin >> troopsToTrain[6];
vector<int> trainingInfo = retrainTroops(troopsToTrain, barracksNum);
outputChart(trainingInfo);
return 0;
}