結果
| 問題 |
No.2178 Payable Magic Items
|
| コンテスト | |
| ユーザー |
nono00
|
| 提出日時 | 2023-01-06 23:32:29 |
| 言語 | C++17 (gcc 13.3.0 + boost 1.87.0) |
| 結果 |
AC
|
| 実行時間 | 95 ms / 4,000 ms |
| コード長 | 1,615 bytes |
| コンパイル時間 | 1,978 ms |
| コンパイル使用メモリ | 198,920 KB |
| 最終ジャッジ日時 | 2025-02-10 00:28:28 |
|
ジャッジサーバーID (参考情報) |
judge5 / judge3 |
(要ログイン)
| ファイルパターン | 結果 |
|---|---|
| sample | AC * 4 |
| other | AC * 23 |
ソースコード
#include <bits/stdc++.h>
using namespace std;
/*
*
* 全ての性能において上回っている魔道具のみ残す
*
*/
int main() {
int n, k;
cin >> n >> k;
vector<int> s(n);
int sz = 1;
for (int i = 0; i < k; i++) sz *= 5;
vector<bool> result(sz, false);
vector<bool> exist(sz, false);
vector<int> use(sz, -1);
for (int i = 0; i < n; i++) {
string t;
cin >> t;
int state = 0;
int now = 1;
for (int j = 0; j < k; j++) {
state += now * (t[j] - '0');
now *= 5;
}
s[i] = state;
exist[state] = true;
}
auto i2s = [&k](int state) {
string t;
for (int i = 0; i < k; i++) {
t.push_back((char)((state % 5) + '0'));
state /= 5;
}
return t;
};
function<bool(int)> f = [&](int state) -> bool {
if (sz <= state) {
return false;
}
if (use[state] != -1) {
return result[state];
}
string t = i2s(state);
bool flag = false;
int now = 1;
for (int i = 0; i < k; i++) {
if (t[i] - '0' < 4) {
flag |= f(state + now);
}
now *= 5;
}
result[state] = flag;
use[state] = 0;
if (!flag && exist[state]) {
result[state] = true;
use[state] = 1;
}
return result[state];
};
f(0);
int ans = n;
for (int i = 0; i < sz; i++) {
if (use[i] == 1)
ans--;
}
cout << ans << endl;
}
nono00