結果
問題 | No.398 ハーフパイプ(2) |
ユーザー |
![]() |
提出日時 | 2024-12-19 20:09:44 |
言語 | C++23 (gcc 13.3.0 + boost 1.87.0) |
結果 |
AC
|
実行時間 | 414 ms / 2,000 ms |
コード長 | 1,543 bytes |
コンパイル時間 | 1,918 ms |
コンパイル使用メモリ | 89,408 KB |
実行使用メモリ | 51,412 KB |
最終ジャッジ日時 | 2024-12-19 20:09:55 |
合計ジャッジ時間 | 10,246 ms |
ジャッジサーバーID (参考情報) |
judge2 / judge4 |
(要ログイン)
ファイルパターン | 結果 |
---|---|
other | AC * 17 |
ソースコード
#include <iostream> #include <vector> using namespace std; inline int idx(int a, int b, int s) { return (s * 101 + a) * 101 + b; } int main() { double input; cin >> input; int X = static_cast<int>(input * 4); const int MAX_A = 101; const int MAX_B = 101; const int MAX_S = 601; const int M = MAX_A * MAX_B * MAX_S; vector<int> dp(M, 0); for (int x = 0; x < MAX_A; ++x) { dp[idx(x, x, x)] = 1; } for (int step = 0; step < 5; ++step) { vector<int> prev = dp; fill(dp.begin(), dp.end(), 0); for (int a = 0; a < MAX_A; ++a) { for (int b = a; b < MAX_B; ++b) { for (int s = 0; s < MAX_S; ++s) { if (prev[idx(a, b, s)] > 0) { for (int x = 0; x < MAX_A; ++x) { int new_a = min(a, x); int new_b = max(b, x); int new_s = s + x; if (new_s < MAX_S) { dp[idx(new_a, new_b, new_s)] += prev[idx(a, b, s)]; } } } } } } } long long ans = 0; for (int a = 0; a < MAX_A; ++a) { for (int b = 0; b < MAX_B; ++b) { for (int s = 0; s < MAX_S; ++s) { if (a + b + X == s) { ans += dp[idx(a, b, s)]; } } } } cout << ans << endl; return 0; }