結果
| 問題 |
No.107 モンスター
|
| コンテスト | |
| ユーザー |
syoken_desuka
|
| 提出日時 | 2015-07-11 17:03:53 |
| 言語 | C++11(廃止可能性あり) (gcc 13.3.0) |
| 結果 |
WA
|
| 実行時間 | - |
| コード長 | 3,055 bytes |
| コンパイル時間 | 800 ms |
| コンパイル使用メモリ | 90,744 KB |
| 実行使用メモリ | 7,552 KB |
| 最終ジャッジ日時 | 2024-07-08 02:59:21 |
| 合計ジャッジ時間 | 1,793 ms |
|
ジャッジサーバーID (参考情報) |
judge1 / judge3 |
(要ログイン)
| ファイルパターン | 結果 |
|---|---|
| sample | AC * 4 |
| other | AC * 16 WA * 5 |
コンパイルメッセージ
main.cpp:81:8: warning: extra tokens at end of #endif directive [-Wendif-labels]
81 | #endif _DEBUG
| ^~~~~~
main.cpp:93:8: warning: extra tokens at end of #endif directive [-Wendif-labels]
93 | #endif _DEBUG
| ^~~~~~
main.cpp:104:8: warning: extra tokens at end of #endif directive [-Wendif-labels]
104 | #endif _DEBUG
| ^~~~~~
ソースコード
#include <algorithm>
#include <array>
#include <sstream>
#include <cstdio>
#include <cstdlib>
#include <cctype>
#include <ostream>
#include<complex>
#include <cmath>
#include <iostream>
#include <stack>
#include <fstream>
#include <queue>
#include <list>
#include <map>
#include <numeric>
#include <set>
#include <sstream>
#include <bitset>
#include <iomanip>
#include <string>
#include <vector>
#include <string>
using namespace std;
#define OB (bitset<32>)
#define REP(i,a,n) for(int i=(a); i<(int)(n); i++)
#define rep(i,n) REP(i,0,n)
#define ALLOF(c) begin(), (c),end()
typedef long long ll;
//BitUtility
#define B_VOID 0
#define B_ONLY_I(i) (1<<i)
#define B_ALL_SIZE_K(k) ((1<< k)-1)
#define B_S_CONTAIN_I(S,i) (S >> i & 1)
#define B_ADD_I(S,i) (S | 1 << i)
#define B_REMOVE_I(S,i) (S & ~(1 << k))
#define B_JOIN(A,B) (A | B)
#define B_SET_A_SUB_B(A,B) (B_JOIN(A,B) & ~B)
#define B_INTERSECTION(A,B) (S & T)
#define B_BOTTOM_BIT(i) (i & -i)
/*snippet list
bitpermutation
*/
int main()
{
int n;
int d[16];
int dp[1 << 16][16];//のこった体力 倒した敵、その時のレベル
int max_level = 0;
int end_code;
cin >> n;
fill(d,d+16,1000000);// 1000より大きく
rep(i,n)
cin >> d[i];
sort(d, d + 16);
end_code = 1 << n - 1;
fill(*dp, *dp + ((1<<16) * 16), 0);
rep(i,n)
{
if (d[i] < 0)
{
max_level++;
}
else break;
}
dp[0][0] = 100; //init HP
//要素数1,2,...,nのビット集合を昇順に列挙
//int k = 4;//列挙子の最大個数
REP(i,1,n+1)
{
int comb = (1 << i) - 1;
while (comb < (1 << n))
{
int mask = 1;
#ifdef _DEBUG
cout << OB comb << endl;
#endif _DEBUG
//enum before
for (int j = 0; j < n; j++)
{
int before = ~(1 << j) & comb;
int next = comb;
if (before == comb)
{
continue;
}
#ifdef _DEBUG
cout << OB before << " to " << OB comb << endl;
#endif _DEBUG
int level = 0;
rep(k,n) // level check
{
if (d[k] < 0)
{
if (B_S_CONTAIN_I(before,k) != 0) level++;
}else break;
}
#ifdef _DEBUG
cout << "now level is " << level << endl;
#endif _DEBUG
//hirou dp
if (d[j] < 0) //teki
{
dp[next][level+1] = max(dp[next][level+1],dp[before][level] + d[j]);
}else // iiyatu
{
if (dp[before][level] == 0) continue; //すでに死んでる
dp[next][level] = min(100*(level+1),dp[before][level]+d[j]);
}
}
int x = comb & -comb, y = comb + x;
comb = (comb & ~y) / x >> 1 | y;
}
}
cout << dp[(1 << n)-1][max_level] << endl;
return 0;
}
syoken_desuka