結果
問題 |
No.5021 Addition Pyramid
|
ユーザー |
![]() |
提出日時 | 2025-03-21 14:05:16 |
言語 | C++17 (gcc 13.3.0 + boost 1.87.0) |
結果 |
AC
|
実行時間 | 3 ms / 2,000 ms |
コード長 | 1,942 bytes |
コンパイル時間 | 1,461 ms |
コンパイル使用メモリ | 105,860 KB |
実行使用メモリ | 5,888 KB |
スコア | 2,214,375 |
最終ジャッジ日時 | 2025-03-21 14:05:20 |
合計ジャッジ時間 | 3,829 ms |
ジャッジサーバーID (参考情報) |
judge2 / judge3 |
純コード判定しない問題か言語 |
(要ログイン)
ファイルパターン | 結果 |
---|---|
other | AC * 50 |
ソースコード
#include <iostream> #include <vector> #include <random> #include <cstdlib> #include <algorithm> #include <cmath> using namespace std; const int MOD = 100000000; int main(){ ios::sync_with_stdio(false); cin.tie(nullptr); int N; cin >> N; // ターゲットのピラミッド値を三角形状に読み込む vector<vector<int>> target(N); for (int i = 0; i < N; i++){ target[i].resize(i + 1); for (int j = 0; j <= i; j++){ cin >> target[i][j]; } } // 乱数生成器の用意 random_device rd; mt19937 rng(rd()); uniform_int_distribution<int> uni(0, MOD - 1); // 最下段の値 c[0..N-1] を乱数で生成 vector<int> bottom(N); for (int i = 0; i < N; i++){ bottom[i] = uni(rng); } // ピラミッドを最下段から上へ再構築 vector<vector<int>> pyramid(N); pyramid[N - 1] = bottom; for (int i = N - 2; i >= 0; i--){ pyramid[i].resize(i + 1); for (int j = 0; j <= i; j++){ long long sum = static_cast<long long>(pyramid[i + 1][j]) + pyramid[i + 1][j + 1]; pyramid[i][j] = sum % MOD; } } // 各セルの誤差を計算し,その最大値を求める int max_error = 0; for (int i = 0; i < N; i++){ for (int j = 0; j <= i; j++){ int diff = abs(pyramid[i][j] - target[i][j]); int err = min(diff, MOD - diff); max_error = max(max_error, err); } } // スコア計算 (5×10⁷ - 最大誤差) int score = 50000000 - max_error; // デバッグ用にシミュレーション結果を標準エラー出力へ cerr << "Max error: " << max_error << "\n"; cerr << "Score: " << score << "\n"; // 最下段の値を出力 for (int i = 0; i < N; i++){ cout << bottom[i] << (i + 1 == N ? "\n" : " "); } return 0; }