69 lines
1.3 KiB
C++
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;
|
|
}
|