結果
問題 |
No.1345 Beautiful BINGO
|
ユーザー |
|
提出日時 | 2021-01-23 15:10:09 |
言語 | C++17 (gcc 13.3.0 + boost 1.87.0) |
結果 |
AC
|
実行時間 | 207 ms / 2,000 ms |
コード長 | 1,557 bytes |
コンパイル時間 | 874 ms |
コンパイル使用メモリ | 83,332 KB |
最終ジャッジ日時 | 2025-01-18 07:29:44 |
ジャッジサーバーID (参考情報) |
judge1 / judge4 |
(要ログイン)
ファイルパターン | 結果 |
---|---|
sample | AC * 2 |
other | AC * 61 |
ソースコード
#line 1 "main.cpp" #include <iostream> #include <algorithm> #include <vector> using namespace std; constexpr int INF = 1 << 30; void solve() { int n, m; cin >> n >> m; auto xss = vector(n, vector(n, 0)); for (auto& xs : xss) { for (auto& x : xs) cin >> x; } int ans = INF; for (int b = 0; b < 4; ++b) { auto yss = xss; int cost = 0, rem = m; if (b & 1) { --rem; for (int i = 0; i < n; ++i) { cost += yss[i][i]; yss[i][i] = 0; } } if (b & 2) { --rem; for (int i = 0; i < n; ++i) { cost += yss[i][n - 1 - i]; yss[i][n - 1 - i] = 0; } } for (int p = 0; p < (1 << n); ++p) { int c = cost; int r = rem - __builtin_popcount(p); if (r > n) continue; for (int i = 0; i < n; ++i) { if ((~p >> i) & 1) continue; for (int j = 0; j < n; ++j) c += yss[i][j]; } vector<int> cs(n, 0); for (int j = 0; j < n; ++j) { for (int i = 0; i < n; ++i) { if ((~p >> i) & 1) cs[j] += yss[i][j]; } } sort(cs.begin(), cs.end()); for (int i = 0; i < r; ++i) c += cs[i]; ans = min(ans, c); } } cout << ans << "\n"; } int main() { cin.tie(nullptr); ios::sync_with_stdio(false); solve(); return 0; }