intさわだんのBlack History

刹那的レジェンドになりたい。

ICPC 国内予選2010C ポロック予想 AOJ1167

かなり初歩的なDPやるだけ。

#include <bits/stdc++.h>
#define chmin(a, b) ((a)=min((a), (b)))
#define chmax(a, b) ((a)=max((a), (b)))
#define fs first
#define sc second
#define eb emplace_back
using namespace std;
 
typedef long long ll;
typedef pair<int, int> P;
typedef tuple<int, int, int> T;
 
const ll MOD=1e9+7;
const ll INF=1e18;
 
int dx[]={1, -1, 0, 0};
int dy[]={0, 0, 1, -1};

int dp[1000005][2];

int main(){
    for(int i = 1;i <= 1000000;i++){
        dp[i][0] = 10000000;
        dp[i][1] = 10000000;
    }

    for(int i = 1; i*(i+1)*(i+2)/6 < 1000000;i++){
        int simen = i*(i+1)*(i+2)/6;
        for(int j = 0; j + simen < 1000000;j++){
            for(int k = 0;k < 2;k++){
                if(k == 1 && simen % 2 == 0) continue;
                dp[j+simen][k] = min(dp[j+simen][k],dp[j][k]+1);
            }
        }
    }
    int n;
    while(true){
        cin >> n;
        if(n == 0) break;
        cout << dp[n][0] << " " << dp[n][1] << endl;
    }
}