Files
contests/2022/sector/10/pyramid/pyramid.cpp

69 lines
1.3 KiB
C++

#include <bits/stdc++.h>
using namespace std;
ifstream in("test.in");
ofstream out("test.out");
unordered_set<int> cardRequirements;
// Pre-fill a set containing possible amounts of cards required to build towers
void fillRequirements() {
cardRequirements.insert(2);
// At height 1:
int levelCards = 2;
int cards = 2;
// (1 <= n <= 10 * 9)
int stop = pow(10, 9);
// height > 1
while (cards <= stop) {
// cout << "calculating for cards " << cards << endl;
levelCards += 3;
cards += levelCards;
cardRequirements.insert(cards);
}
}
void solveTestCase() {
int cards;
in >> cards;
// cout << "here" << endl;
if (cards == 1) {
out << 0 << endl;
return;
}
int towerAmount = 0;
while (cards > 1) {
int cardsToUse;
// Go backwards in amount of cards and check if that amount can be used to build a valid tower
for (cardsToUse = cards; cardsToUse > 1; cardsToUse--) {
if (cardRequirements.count(cardsToUse) == 1) {
towerAmount++;
cards -= cardsToUse;
break;
}
}
}
out << towerAmount << endl;
}
int main() {
fillRequirements();
int t;
in >> t;
for (int i = 0; i < t; i++) {
solveTestCase();
}
return 0;
}