結果
問題 |
No.5021 Addition Pyramid
|
ユーザー |
|
提出日時 | 2025-02-25 20:20:31 |
言語 | C++23 (gcc 13.3.0 + boost 1.87.0) |
結果 |
AC
|
実行時間 | 1,903 ms / 2,000 ms |
コード長 | 2,272 bytes |
コンパイル時間 | 3,586 ms |
コンパイル使用メモリ | 283,012 KB |
実行使用メモリ | 6,820 KB |
スコア | 2,112,981 |
最終ジャッジ日時 | 2025-02-25 20:22:15 |
合計ジャッジ時間 | 103,212 ms |
ジャッジサーバーID (参考情報) |
judge2 / judge1 |
純コード判定しない問題か言語 |
(要ログイン)
ファイルパターン | 結果 |
---|---|
other | AC * 50 |
ソースコード
#include <bits/stdc++.h> using namespace std; using ll = long long; const int MOD = 1e8; const int N = 50; mt19937 rng(chrono::steady_clock::now().time_since_epoch().count()); vector<vector<int>> A(N), B(N); vector<int> base(N); int mod(int x) { return ((x % MOD) + MOD) % MOD; } int compute_error(int a, int b) { int diff = abs(a - b); return min(diff, MOD - diff); } void compute_pyramid() { for (int i = N - 2; i >= 0; --i) { for (int j = 0; j <= i; ++j) { B[i][j] = mod(B[i + 1][j] + B[i + 1][j + 1]); } } } int evaluate() { compute_pyramid(); int max_error = 0; for (int i = 0; i < N; ++i) { for (int j = 0; j <= i; ++j) { max_error = max(max_error, compute_error(A[i][j], B[i][j])); } } return 5e7 - max_error; } void solve() { // 入力 for (int i = 0; i < N; ++i) { A[i].resize(i + 1); B[i].resize(i + 1); for (int j = 0; j <= i; ++j) { cin >> A[i][j]; } } // 初期解: 最下段を与えられた最上段の値から推定 for (int i = 0; i < N; ++i) base[i] = A[N-1][i]; B[N-1] = base; int best_score = evaluate(); vector<int> best_base = base; auto start_time = chrono::steady_clock::now(); double TIME_LIMIT = 1.9; // 1.9秒で打ち切る while (true) { auto now = chrono::steady_clock::now(); double elapsed = chrono::duration<double>(now - start_time).count(); if (elapsed > TIME_LIMIT) break; // 局所探索: 1つの要素をランダムに変更 int idx = rng() % N; int delta = (rng() % 20001) - 10000; // -10000 から 10000の範囲で調整 int old_value = base[idx]; base[idx] = mod(base[idx] + delta); B[N-1] = base; int new_score = evaluate(); if (new_score > best_score) { best_score = new_score; best_base = base; } else { base[idx] = old_value; } } // 最良の解を出力 for (int i = 0; i < N; ++i) { cout << best_base[i] << " "; } cout << endl; } int main() { ios::sync_with_stdio(false); cin.tie(nullptr); solve(); return 0; }