#include using namespace std; ifstream in("test.in"); ofstream out("test.out"); unordered_set 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; }