#include <iostream>
#include <list>
using namespace std;
class Coin
{
public:
int index;
int value;
};
void fixTail(list<Coin>& coinList)
{
Coin lastCoin = coinList.back();
if (lastCoin.value > 1) {
int moveToNextBit = lastCoin.value / 2;
lastCoin.value = lastCoin.value % 2;
Coin nextCoin;
nextCoin.index = lastCoin.index += 1;
nextCoin.value = moveToNextBit;
coinList.push_back(nextCoin);
}
}
int main() {
// deklaracja zmiennych
int numberOfCoins; //1 <= numberOfCoins <= 1 000 000
int *coins;
int binarySumOfMoney[201719] = {0};
int maxCoin = -1; //0 <= maxCoin <= 201718
list<Coin> sumOfMoney;
// wczytywanie zmiennych
cin>>numberOfCoins;
coins = new int[numberOfCoins];
for (int i = 0; i < numberOfCoins; i++) {
cin>>coins[i];
}
// dla kazdej wczytanej dodac 1
for (int i = 0; i < numberOfCoins; i++) {
int currentCoin = coins[i];
binarySumOfMoney[currentCoin] += 1;
if (currentCoin > maxCoin) {
maxCoin = currentCoin;
}
}
// zsumowac dane w tablicy
for (int i = 0; i <= maxCoin; i++) {
if (binarySumOfMoney[i] == 0) {
continue;
} else if (binarySumOfMoney[i] > 0) {
// add coin to the list
Coin currentCoin;
currentCoin.index = i;
currentCoin.value = binarySumOfMoney[i];
if (sumOfMoney.size() == 0)
{
sumOfMoney.push_back(currentCoin);
} else {
if (sumOfMoney.back().index == currentCoin.index){
sumOfMoney.back().value += currentCoin.value;
} else {
sumOfMoney.push_back(currentCoin);
}
}
fixTail(sumOfMoney);
}
}
// fixuj ogon do konca
while (sumOfMoney.back().value > 1) {
fixTail(sumOfMoney);
}
// zwroc najwyzszy indeks z tablicy czyli najwyzsza mozliwa do dostania monete
cout << sumOfMoney.back().index << 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 | #include <iostream> #include <list> using namespace std; class Coin { public: int index; int value; }; void fixTail(list<Coin>& coinList) { Coin lastCoin = coinList.back(); if (lastCoin.value > 1) { int moveToNextBit = lastCoin.value / 2; lastCoin.value = lastCoin.value % 2; Coin nextCoin; nextCoin.index = lastCoin.index += 1; nextCoin.value = moveToNextBit; coinList.push_back(nextCoin); } } int main() { // deklaracja zmiennych int numberOfCoins; //1 <= numberOfCoins <= 1 000 000 int *coins; int binarySumOfMoney[201719] = {0}; int maxCoin = -1; //0 <= maxCoin <= 201718 list<Coin> sumOfMoney; // wczytywanie zmiennych cin>>numberOfCoins; coins = new int[numberOfCoins]; for (int i = 0; i < numberOfCoins; i++) { cin>>coins[i]; } // dla kazdej wczytanej dodac 1 for (int i = 0; i < numberOfCoins; i++) { int currentCoin = coins[i]; binarySumOfMoney[currentCoin] += 1; if (currentCoin > maxCoin) { maxCoin = currentCoin; } } // zsumowac dane w tablicy for (int i = 0; i <= maxCoin; i++) { if (binarySumOfMoney[i] == 0) { continue; } else if (binarySumOfMoney[i] > 0) { // add coin to the list Coin currentCoin; currentCoin.index = i; currentCoin.value = binarySumOfMoney[i]; if (sumOfMoney.size() == 0) { sumOfMoney.push_back(currentCoin); } else { if (sumOfMoney.back().index == currentCoin.index){ sumOfMoney.back().value += currentCoin.value; } else { sumOfMoney.push_back(currentCoin); } } fixTail(sumOfMoney); } } // fixuj ogon do konca while (sumOfMoney.back().value > 1) { fixTail(sumOfMoney); } // zwroc najwyzszy indeks z tablicy czyli najwyzsza mozliwa do dostania monete cout << sumOfMoney.back().index << endl; return 0; } |
English