結果

問題 No.107 モンスター
ユーザー Ysmr_RyYsmr_Ry
提出日時 2014-12-28 14:31:46
言語 C++11
(gcc 13.3.0)
結果
AC  
実行時間 4 ms / 5,000 ms
コード長 708 bytes
コンパイル時間 258 ms
コンパイル使用メモリ 36,700 KB
実行使用メモリ 5,248 KB
最終ジャッジ日時 2024-12-18 01:21:32
合計ジャッジ時間 940 ms
ジャッジサーバーID
(参考情報)
judge5 / judge4
このコードへのチャレンジ
(要ログイン)
ファイルパターン 結果
sample AC * 4
other AC * 21
権限があれば一括ダウンロードができます
コンパイルメッセージ
main.cpp: In function ‘int main()’:
main.cpp:13:14: warning: ignoring return value of ‘int scanf(const char*, ...)’ declared with attribute ‘warn_unused_result’ [-Wunused-result]
   13 |         scanf( "%d", &N );
      |         ~~~~~^~~~~~~~~~~~
main.cpp:15:22: warning: ignoring return value of ‘int scanf(const char*, ...)’ declared with attribute ‘warn_unused_result’ [-Wunused-result]
   15 |                 scanf( "%d", D+i );
      |                 ~~~~~^~~~~~~~~~~~~

ソースコード

diff #

#include<cstdio>
#include<algorithm>
#include<limits>
#define rep(i,a) for(int i=0;i<(a);++i)

const int MAX_N = 16, INF = std::numeric_limits<int>::max()>>2;

int N, D[MAX_N];
int dp[1<<MAX_N+1];

int main()
{
	scanf( "%d", &N );
	rep( i, N )
		scanf( "%d", D+i );

	std::fill( dp, dp+(1<<N), -INF );
	dp[0] = 100;
	rep( S, 1<<N )
	{
		if( dp[S] < 0 )
			continue;

		int did = 1;
		rep( i, N ) if( S>>i&1 && D[i] < 0 )
			++did;
		rep( i, N ) if( !(S>>i&1) )
		{
			if( D[i] > 0 )
				dp[S|1<<i] = std::min( did*100, std::max( dp[S|1<<i], dp[S]+D[i] ) );
			else if( dp[S]+D[i] > 0 )
				dp[S|1<<i] = std::max( dp[S|1<<i], dp[S]+D[i] );
		}
	}

	printf( "%d\n", std::max( 0, dp[(1<<N)-1] ) );

	return 0;
}
0