結果
問題 | No.107 モンスター |
ユーザー |
![]() |
提出日時 | 2015-06-27 03:00:42 |
言語 | C++11(廃止可能性あり) (gcc 13.3.0) |
結果 |
AC
|
実行時間 | 10 ms / 5,000 ms |
コード長 | 931 bytes |
コンパイル時間 | 935 ms |
コンパイル使用メモリ | 80,028 KB |
実行使用メモリ | 8,064 KB |
最終ジャッジ日時 | 2024-12-18 01:41:49 |
合計ジャッジ時間 | 1,887 ms |
ジャッジサーバーID (参考情報) |
judge1 / judge2 |
(要ログイン)
ファイルパターン | 結果 |
---|---|
sample | AC * 4 |
other | AC * 21 |
ソースコード
#include <iostream> #include <algorithm> #include <cmath> #include <vector> #include <complex> #include <queue> #include <set> #include <map> using namespace std; #define REP(i,a,b) for(int i=a;i<(int)b;i++) #define rep(i,n) REP(i,0,n) typedef long long ll; int dp[1<<17][19]; int main() { int N; cin >> N; int D[N]; rep(i, N) { cin >> D[i]; } dp[0][1] = 100; for(int S=0; S<(1<<N); S++) { for(int W=1; W<18; W++) { if(dp[S][W] <= 0) { continue; } for(int i=0; i<N; i++) { if(!(S >> i & 1)) { if(D[i] < 0) { if(dp[S][W]+D[i] <= 0) { continue; } dp[S|(1<<i)][W+1] = max(dp[S|(1<<i)][W+1], dp[S][W]+D[i]); } else { dp[S|(1<<i)][W] = max(dp[S|(1<<i)][W], min(W*100, dp[S][W]+D[i])); } } } } } int ans = 0; REP(i,1,18) { ans = max(ans, dp[(1<<N)-1][i]); } cout << ans << endl; return 0; }