#include #include #include #include #include #include #include #include #include #include #include #include #include #include using namespace std; #define REP(i,n) for(int i=0; i=b; --i) #define ALL(c) (c).begin(), (c).end() typedef long long ll; typedef vector VI; typedef vector VL; typedef vector VVL; typedef vector VVI; typedef pair P; typedef pair PL; VI tri; int dp[100000001]; int calc(int n){ if (n == 0) return 0; // cout << n << endl; if (dp[n]) return dp[n]; int p = upper_bound(ALL(tri), n) - tri.begin() - 1; int ret = calc(n - tri[p]) + 1; if (p) ret = min(ret, calc(n - tri[p - 1]) + 1); return dp[n] = ret; } int main() { int n; cin >> n; FOR(i,1,100000){ int x = i * (i+1) / 2; if (x > n) break; tri.push_back(x); } cout << calc(n) << endl; return 0; }