#include <iostream> #include <vector> #include <algorithm> using namespace std; struct Pirate { int greed; int index; bool operator<(const Pirate& other) const { return greed < other.greed; } }; vector<int> pirate_greed(int n, int m, vector<int>& greed_factors) { vector<int> result(n, -1); vector<Pirate> pirates; for (int i = 0; i < n; i++) { pirates.push_back({greed_factors[i], i}); } sort(pirates.begin(), pirates.end()); // Sortowanie piratów wg chciwości vector<bool> eliminated(n, false); while (true) { int proposer = -1; for (int i = 0; i < n; i++) { if (!eliminated[i]) { proposer = i; break; } } if (proposer == -1) break; // Wszyscy wyrzuceni int remaining_pirates = 0; for (int i = 0; i < n; i++) { if (!eliminated[i]) remaining_pirates++; } if (remaining_pirates == 1) { result[proposer] = m; break; } int needed_votes = remaining_pirates / 2 + 1; vector<int> allocation(n, 0); allocation[proposer] = m; vector<int> voters; voters.push_back(proposer); for (int i = n - 1; i >= 0; i--) { if (eliminated[pirates[i].index]) continue; if (voters.size() >= needed_votes) break; int pi = pirates[i].index; allocation[pi] = greed_factors[pi]; allocation[proposer] -= greed_factors[pi]; voters.push_back(pi); } if (allocation[proposer] >= 0 && voters.size() >= needed_votes) { for (int i : voters) { result[i] = allocation[i]; } break; } eliminated[proposer] = true; } return result; } int main() { int n, m; cin >> n >> m; vector<int> greed_factors(n); for (int i = 0; i < n; i++) { cin >> greed_factors[i]; } vector<int> output = pirate_greed(n, m, greed_factors); for (int i = 0; i < n; i++) { cout << output[i] << " "; } cout << endl; 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 | #include <iostream> #include <vector> #include <algorithm> using namespace std; struct Pirate { int greed; int index; bool operator<(const Pirate& other) const { return greed < other.greed; } }; vector<int> pirate_greed(int n, int m, vector<int>& greed_factors) { vector<int> result(n, -1); vector<Pirate> pirates; for (int i = 0; i < n; i++) { pirates.push_back({greed_factors[i], i}); } sort(pirates.begin(), pirates.end()); // Sortowanie piratów wg chciwości vector<bool> eliminated(n, false); while (true) { int proposer = -1; for (int i = 0; i < n; i++) { if (!eliminated[i]) { proposer = i; break; } } if (proposer == -1) break; // Wszyscy wyrzuceni int remaining_pirates = 0; for (int i = 0; i < n; i++) { if (!eliminated[i]) remaining_pirates++; } if (remaining_pirates == 1) { result[proposer] = m; break; } int needed_votes = remaining_pirates / 2 + 1; vector<int> allocation(n, 0); allocation[proposer] = m; vector<int> voters; voters.push_back(proposer); for (int i = n - 1; i >= 0; i--) { if (eliminated[pirates[i].index]) continue; if (voters.size() >= needed_votes) break; int pi = pirates[i].index; allocation[pi] = greed_factors[pi]; allocation[proposer] -= greed_factors[pi]; voters.push_back(pi); } if (allocation[proposer] >= 0 && voters.size() >= needed_votes) { for (int i : voters) { result[i] = allocation[i]; } break; } eliminated[proposer] = true; } return result; } int main() { int n, m; cin >> n >> m; vector<int> greed_factors(n); for (int i = 0; i < n; i++) { cin >> greed_factors[i]; } vector<int> output = pirate_greed(n, m, greed_factors); for (int i = 0; i < n; i++) { cout << output[i] << " "; } cout << endl; return 0; } |