fork download
  1. #include <iostream>
  2. #include <vector>
  3.  
  4. using namespace std;
  5.  
  6. //The number of different troops
  7. const int TROOP_AMOUNT = 7;
  8.  
  9. //Not sure where you guys store this data but here
  10. //are the training times for each troop (in seconds)
  11. //note that the training times for the supply cart and the ballista are switched for simplicity
  12. const int TRAINING_TIMES[7] = {35, 50, 150, 210, 300, 900, 960};
  13.  
  14. //Predicate function for the binary search
  15. bool predicate(vector<int> troopsToTrain, int barracksNum, int time){
  16. vector<int> barracks;
  17. barracks.resize(barracksNum, 0);
  18.  
  19. for (int i = 0; i < barracksNum; i++){
  20. for (int j = TROOP_AMOUNT-1; j >= 0; j--){
  21. while (troopsToTrain[j] > 0 && barracks[i]+TRAINING_TIMES[j] <= time){
  22. barracks[i] += TRAINING_TIMES[j];
  23. troopsToTrain[j]--;
  24. }
  25. }
  26. }
  27.  
  28. for (int i = 0; i < TROOP_AMOUNT; i++){
  29. if (troopsToTrain[i] > 0){
  30. return false;
  31. }
  32. }
  33.  
  34. return true;
  35. }
  36.  
  37. //Function that returns an array of integers
  38. //At index 0 : the amount of time it takes to retrain (in seconds)
  39. //After index 0 : a -1 denotes the start of a new barracks
  40. // each -1 is followed by troop "IDs"
  41. // and the amount of that troop on that barrack
  42. //troopsToTrain : stores the amount of each troop, the key being its "ID",
  43. // for example, troopsToTrain[0] holds the amount of infantry that has to be retrained
  44. //barracksNum : amount of barracks the player has
  45. vector<int> retrainTroops(vector<int> troopsToTrain, int barracksNum){
  46. //Array on which we are going to store the data
  47. vector<int> trainingInfo;
  48.  
  49. //Note It should be TROOP_AMOUNT*barracksNum but i changed it so the chart works properly
  50. trainingInfo.resize(1+ TROOP_AMOUNT*3 +barracksNum);
  51.  
  52. //Check if all troops are multiples of barracksNum
  53. bool isMultiple = true;
  54. for (int i = 0; i < troopsToTrain.size(); i++){
  55. if (troopsToTrain[i]%barracksNum != 0){
  56. isMultiple = false;
  57. break;
  58. }
  59. }
  60.  
  61. //If they are, spread them evenly across all barracks
  62. if (isMultiple){
  63. for (int i = 0; i < barracksNum; i++){
  64. trainingInfo[1 + i*(TROOP_AMOUNT+1)] = -1;
  65. for (int j = 0; j < TROOP_AMOUNT; j++){
  66. trainingInfo[1 + i*(TROOP_AMOUNT+1) + j+1] = troopsToTrain[j]/barracksNum;
  67. trainingInfo[0] += troopsToTrain[j]/barracksNum * TRAINING_TIMES[j];
  68. }
  69. }
  70.  
  71. trainingInfo[0] /= barracksNum;
  72. return trainingInfo;
  73. }
  74.  
  75. //If not, use binary search
  76. int left, right, mid;
  77. int troopTotal;
  78.  
  79. troopTotal = 0;
  80. right = 0;
  81. for (int i = TROOP_AMOUNT-1; i >= 0; i--){
  82. if (troopsToTrain[i] > 0){
  83. left = TRAINING_TIMES[i];
  84. }
  85. right += TRAINING_TIMES[i]*troopsToTrain[i];
  86. troopTotal += troopsToTrain[i];
  87. }
  88. mid = left+(right-left)/2;
  89. mid -= mid%5;
  90.  
  91. bool tempPredicate, tempPredicate2;
  92. tempPredicate = predicate(troopsToTrain, barracksNum, mid);
  93. tempPredicate2 = predicate(troopsToTrain, barracksNum, mid-5);
  94. while (!(tempPredicate && !tempPredicate2)){
  95. if (tempPredicate){
  96. right = mid;
  97. }
  98. else{
  99. left = mid;
  100. }
  101. mid = left+(right-left)/2;
  102. mid -= mid%5;
  103.  
  104. tempPredicate = predicate(troopsToTrain, barracksNum, mid);
  105. tempPredicate2 = predicate(troopsToTrain, barracksNum, mid-5);
  106. }
  107.  
  108. //Fill the array with data
  109. trainingInfo[0] = mid;
  110.  
  111. vector<int> barracks;
  112. barracks.resize(barracksNum, 0);
  113.  
  114. for (int i = 0; i < barracksNum; i++){
  115. trainingInfo[1 + i*(TROOP_AMOUNT+1)] = -1;
  116. for (int j = TROOP_AMOUNT-1; j >= 0; j--){
  117. while (troopsToTrain[j] > 0 && barracks[i]+TRAINING_TIMES[j] <= mid){
  118. barracks[i] += TRAINING_TIMES[j];
  119. troopsToTrain[j]--;
  120. trainingInfo[1 + i*(TROOP_AMOUNT+1) + j+1]++;
  121. }
  122. }
  123. }
  124.  
  125. return trainingInfo;
  126. }
  127.  
  128. void outputLine(){
  129. cout << "|----------|-----|-----|-----|" << endl;
  130. }
  131.  
  132. void outputChart(vector<int> trainingInfo){
  133. outputLine();
  134. cout << "| Barracks | 1 | 2 | 3 |" << endl;
  135. outputLine();
  136. cout << "| Infantry | " << trainingInfo[1+1] << " | " << trainingInfo[9+1] << " | " << trainingInfo[17+1] << " | " << endl;
  137. outputLine();
  138. cout << "| Archers | " << trainingInfo[1+2] << " | " << trainingInfo[9+2] << " | " << trainingInfo[17+2] << " | " << endl;
  139. outputLine();
  140. cout << "| Raiders | " << trainingInfo[1+3] << " | " << trainingInfo[9+3] << " | " << trainingInfo[17+3] << " | " << endl;
  141. outputLine();
  142. cout << "| Horsemen | " << trainingInfo[1+4] << " | " << trainingInfo[9+4] << " | " << trainingInfo[17+4] << " | " << endl;
  143. outputLine();
  144. cout << "| Miners | " << trainingInfo[1+5] << " | " << trainingInfo[9+5] << " | " << trainingInfo[17+5] << " | " << endl;
  145. outputLine();
  146. cout << "|SupplyCart| " << trainingInfo[1+6] << " | " << trainingInfo[9+6] << " | " << trainingInfo[17+6] << " | " << endl;
  147. outputLine();
  148. cout << "| Bombards | " << trainingInfo[1+7] << " | " << trainingInfo[9+7] << " | " << trainingInfo[17+7] << " | " << endl;
  149. outputLine();
  150.  
  151. int time2 = 0;
  152. int time3 = 0;
  153. for (int a = 10; a < 17; a++){
  154. time2 += TRAINING_TIMES[a-10]*trainingInfo[a];
  155. }
  156. for (int a = 18; a < 25; a++){
  157. time3 += TRAINING_TIMES[a-18]*trainingInfo[a];
  158. }
  159. cout << "| Time | " << trainingInfo[0] << " | " << time2 << " | " << time3 << " | " << endl;
  160. outputLine();
  161. }
  162.  
  163. int main()
  164. {
  165. vector<int> troopsToTrain;
  166. troopsToTrain.resize(TROOP_AMOUNT, 0);
  167. int barracksNum;
  168.  
  169. cin >> barracksNum;
  170. cin >> troopsToTrain[0];
  171. cin >> troopsToTrain[1];
  172. cin >> troopsToTrain[2];
  173. cin >> troopsToTrain[3];
  174. cin >> troopsToTrain[4];
  175. cin >> troopsToTrain[5];
  176. cin >> troopsToTrain[6];
  177.  
  178. vector<int> trainingInfo = retrainTroops(troopsToTrain, barracksNum);
  179.  
  180. outputChart(trainingInfo);
  181.  
  182. return 0;
  183. }
Success #stdin #stdout 0s 3468KB
stdin
3
5
25
0
4
0
2
3
stdout
|----------|-----|-----|-----|
| Barracks |  1  |  2  |  3  |
|----------|-----|-----|-----|
| Infantry |  1  |  1  |  3  |  
|----------|-----|-----|-----|
| Archers  |  3  |  0  |  22  |  
|----------|-----|-----|-----|
| Raiders  |  0  |  0  |  0  |  
|----------|-----|-----|-----|
| Horsemen |  1  |  2  |  1  |  
|----------|-----|-----|-----|
|  Miners  |  0  |  0  |  0  |  
|----------|-----|-----|-----|
|SupplyCart|  0  |  1  |  1  |  
|----------|-----|-----|-----|
| Bombards |  2  |  1  |  0  |  
|----------|-----|-----|-----|
|   Time   | 2315 | 2315 | 2315 | 
|----------|-----|-----|-----|