#include <iostream> #include <stdio.h> using namespace std; const int MAX = 40; void solveSquadRecursively( int armySize, int squadSize, int nRecruits, int recruits[], int foes, int areFoes[][MAX], int result[]) { if (foes > result[0]) { return; } if (nRecruits == squadSize) { if (foes < result[0]) { result[0] = foes; result[1] = 1; } else if (foes == result[0]) { result[1] += 1; } return; } // possible candidates for next recruit int firstCandidate = nRecruits == 0 ? 0 : recruits[nRecruits - 1] + 1; int lastCandidate = armySize - squadSize + nRecruits; for (int candidate = firstCandidate; candidate <= lastCandidate; candidate++) { int candidateFoes = 0; for (int recruit = 0; recruit < nRecruits; recruit++) { candidateFoes += areFoes[candidate][recruits[recruit]]; } recruits[nRecruits] = candidate; solveSquadRecursively( armySize, squadSize, nRecruits + 1, recruits, foes + candidateFoes, areFoes, result); } } void solveSquad(int armySize, int squadSize, int areFoes[][MAX]) { int recruits[squadSize]; int result[2]; result[0] = 1000000; result[1] = 0; solveSquadRecursively( armySize, squadSize, 0, recruits, 0, areFoes, result); printf("%d %d\n", result[0], result[1]); } void solveArmy(int armySize, int areFoes[][MAX]) { for (int squadSize = 1; squadSize <= armySize; squadSize++) { solveSquad(armySize, squadSize, areFoes); } } void orderSoldiersByFoes(int armySize, int areFoes[][MAX]) { int numberOfFoes[armySize]; for (int soldier = 0; soldier < armySize; soldier++) { numberOfFoes[soldier] = 0; } for (int soldierA = 0; soldierA < armySize; soldierA++) { for (int soldierB = 0; soldierB < armySize; soldierB++) { numberOfFoes[soldierA] += areFoes[soldierA][soldierB]; } } int ranking[armySize]; for (int slot = 0; slot < armySize; slot++) { int leastFoes = 1000; int soldierWithLeastFoes = -1; for (int soldier = 0; soldier < armySize; soldier++) { if (numberOfFoes[soldier] < leastFoes) { soldierWithLeastFoes = soldier; leastFoes = numberOfFoes[soldier]; } } ranking[slot] = soldierWithLeastFoes; // destroys numberOfFoes array numberOfFoes[soldierWithLeastFoes] = 1000; } int areFoesByRank[armySize][armySize]; for (int rank = 0; rank < armySize; rank++) { areFoesByRank[rank][rank] = 0; for (int partner = 0; partner < rank; partner++) { areFoesByRank[rank][partner] = areFoesByRank[partner][rank] = areFoes[ranking[rank]][ranking[partner]]; } } for (int soldierA = 0; soldierA < armySize; soldierA++) { for (int soldierB = 0; soldierB < armySize; soldierB++) { areFoes[soldierA][soldierB] = areFoesByRank[soldierA][soldierB]; } } } int main() { int armySize; cin >> armySize; int skills[armySize]; for (int soldier = 0; soldier < armySize; soldier++) { cin >> skills[soldier]; } int areFoes[MAX][MAX]; for (int soldierA = 0; soldierA < armySize; soldierA++) { for (int soldierB = 0; soldierB < armySize; soldierB++) { if ((soldierA - soldierB) * ((skills[soldierA] - skills[soldierB])) < 0) { areFoes[soldierA][soldierB] = 1; } else { areFoes[soldierA][soldierB] = 0; } } } orderSoldiersByFoes(armySize, areFoes); solveArmy(armySize, areFoes); return 0; }
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 | #include <iostream> #include <stdio.h> using namespace std; const int MAX = 40; void solveSquadRecursively( int armySize, int squadSize, int nRecruits, int recruits[], int foes, int areFoes[][MAX], int result[]) { if (foes > result[0]) { return; } if (nRecruits == squadSize) { if (foes < result[0]) { result[0] = foes; result[1] = 1; } else if (foes == result[0]) { result[1] += 1; } return; } // possible candidates for next recruit int firstCandidate = nRecruits == 0 ? 0 : recruits[nRecruits - 1] + 1; int lastCandidate = armySize - squadSize + nRecruits; for (int candidate = firstCandidate; candidate <= lastCandidate; candidate++) { int candidateFoes = 0; for (int recruit = 0; recruit < nRecruits; recruit++) { candidateFoes += areFoes[candidate][recruits[recruit]]; } recruits[nRecruits] = candidate; solveSquadRecursively( armySize, squadSize, nRecruits + 1, recruits, foes + candidateFoes, areFoes, result); } } void solveSquad(int armySize, int squadSize, int areFoes[][MAX]) { int recruits[squadSize]; int result[2]; result[0] = 1000000; result[1] = 0; solveSquadRecursively( armySize, squadSize, 0, recruits, 0, areFoes, result); printf("%d %d\n", result[0], result[1]); } void solveArmy(int armySize, int areFoes[][MAX]) { for (int squadSize = 1; squadSize <= armySize; squadSize++) { solveSquad(armySize, squadSize, areFoes); } } void orderSoldiersByFoes(int armySize, int areFoes[][MAX]) { int numberOfFoes[armySize]; for (int soldier = 0; soldier < armySize; soldier++) { numberOfFoes[soldier] = 0; } for (int soldierA = 0; soldierA < armySize; soldierA++) { for (int soldierB = 0; soldierB < armySize; soldierB++) { numberOfFoes[soldierA] += areFoes[soldierA][soldierB]; } } int ranking[armySize]; for (int slot = 0; slot < armySize; slot++) { int leastFoes = 1000; int soldierWithLeastFoes = -1; for (int soldier = 0; soldier < armySize; soldier++) { if (numberOfFoes[soldier] < leastFoes) { soldierWithLeastFoes = soldier; leastFoes = numberOfFoes[soldier]; } } ranking[slot] = soldierWithLeastFoes; // destroys numberOfFoes array numberOfFoes[soldierWithLeastFoes] = 1000; } int areFoesByRank[armySize][armySize]; for (int rank = 0; rank < armySize; rank++) { areFoesByRank[rank][rank] = 0; for (int partner = 0; partner < rank; partner++) { areFoesByRank[rank][partner] = areFoesByRank[partner][rank] = areFoes[ranking[rank]][ranking[partner]]; } } for (int soldierA = 0; soldierA < armySize; soldierA++) { for (int soldierB = 0; soldierB < armySize; soldierB++) { areFoes[soldierA][soldierB] = areFoesByRank[soldierA][soldierB]; } } } int main() { int armySize; cin >> armySize; int skills[armySize]; for (int soldier = 0; soldier < armySize; soldier++) { cin >> skills[soldier]; } int areFoes[MAX][MAX]; for (int soldierA = 0; soldierA < armySize; soldierA++) { for (int soldierB = 0; soldierB < armySize; soldierB++) { if ((soldierA - soldierB) * ((skills[soldierA] - skills[soldierB])) < 0) { areFoes[soldierA][soldierB] = 1; } else { areFoes[soldierA][soldierB] = 0; } } } orderSoldiersByFoes(armySize, areFoes); solveArmy(armySize, areFoes); return 0; } |