結果
問題 | No.107 モンスター |
ユーザー |
![]() |
提出日時 | 2017-01-14 23:06:58 |
言語 | C++14 (gcc 13.3.0 + boost 1.87.0) |
結果 |
AC
|
実行時間 | 8 ms / 5,000 ms |
コード長 | 1,278 bytes |
コンパイル時間 | 750 ms |
コンパイル使用メモリ | 81,040 KB |
実行使用メモリ | 6,824 KB |
最終ジャッジ日時 | 2024-12-21 12:55:25 |
合計ジャッジ時間 | 1,706 ms |
ジャッジサーバーID (参考情報) |
judge3 / judge2 |
(要ログイン)
ファイルパターン | 結果 |
---|---|
sample | AC * 4 |
other | AC * 21 |
ソースコード
#include <algorithm>#include <iostream>#include <map>#include <queue>#include <set>#include <string>#include <vector>#define rep(i, n) for (int i = 0; i < (n); i++)#define rrep(i, n) for (int i = (n)-1; i >= 0; i--)#define pb push_back#define all(a) (a).begin(), (a).end()#define mp make_pairusing namespace std;typedef long long int lli;lli MOD = 1000000007;int dp[(1 << 16) + 10] = {};//dp[i]=iの内ビットが立ってるのが倒した.ときの体力の残り.//dp[i]+立ってないやつint main(){int n;cin >> n;int d[10005];rep(i, n) cin >> d[i];dp[0] = 100;rep(i, 1 << n){vector<int> done, sel;if (dp[i] == 0)continue;int hp_max = 100;rep(j, n){if ((i >> j) & 1)done.push_back(j);elsesel.push_back(j);}for (auto j : done) {if (d[j] < 0)hp_max += 100;}for (auto j : sel) {if (d[j] > 0)dp[i + (1 << j)] = max(dp[i + (1 << j)], min(dp[i] + d[j], hp_max));elsedp[i + (1 << j)] = max(dp[i + (1 << j)], dp[i] + d[j]);}}cout << dp[(1 << n) - 1] << endl;}