結果

問題 No.335 門松宝くじ
ユーザー startcppstartcpp
提出日時 2016-01-15 23:35:07
言語 C++11
(gcc 11.4.0)
結果
WA  
実行時間 -
コード長 1,370 bytes
コンパイル時間 469 ms
コンパイル使用メモリ 59,464 KB
実行使用メモリ 8,700 KB
最終ジャッジ日時 2023-10-19 23:39:25
合計ジャッジ時間 2,412 ms
ジャッジサーバーID
(参考情報)
judge13 / judge11
このコードへのチャレンジ
(要ログイン)

テストケース

テストケース表示
入力 結果 実行時間
実行使用メモリ
testcase_00 AC 2 ms
5,732 KB
testcase_01 AC 2 ms
5,736 KB
testcase_02 WA -
testcase_03 WA -
testcase_04 WA -
testcase_05 WA -
testcase_06 WA -
testcase_07 AC 14 ms
8,680 KB
testcase_08 AC 1,240 ms
8,680 KB
testcase_09 AC 19 ms
8,680 KB
testcase_10 AC 18 ms
8,680 KB
testcase_11 WA -
testcase_12 AC 18 ms
8,680 KB
testcase_13 AC 19 ms
8,680 KB
権限があれば一括ダウンロードができます

ソースコード

diff #

#include <iostream>
#include <algorithm>
using namespace std;

int n, m;
int a[3][800];	//同じ行の要素の値は重複しない(Nの順列になっている)

double solve(int h){
	int i, j, k;
	int pos[801];
	double ans = 0;
	
	for( i = 0; i < n; i++ )
		pos[a[h][i]] = i;
	
	static int mini[800][800];
	static int maxi[800][800];
	
	for( i = 0; i < n; i++ ){
		for( j = 0; j < n; j++ ){
			mini[i][j] = min(pos[i], pos[j]);
			maxi[i][j] = max(pos[i], pos[j]);
		}
	}
	
	for( i = 1; i <= n; i++ ){
		for( j = i + 1; j <= n; j++ ){
			for( k = n; k >= 1; k-- ){
				if( k == i || k == j ) continue;
				
				//値i, j, kを選んで門松列にできるか?
				//i < j < k
				if( j < k ){
					if( pos[j] < mini[i][k] || pos[j] > maxi[i][k] )
						break;
				}
				//i < k < j
				else if( i < k ){
					if( pos[k] < mini[i][j] || pos[k] > maxi[i][j] )
						break;
				}
				//k < i < j
				else{
					if( pos[i] < mini[k][j] || pos[i] > maxi[k][j] )
						break;
				}
			}
			if( k >= 1 ){
				ans += max(j, k);
			}
		}
	}
	ans /= n * (n - 1);
	ans *= 2;
	return ans;
}

int main()
{
	cin >> n >> m;
	for( int i = 0; i < m; i++ )
		for( int j = 0; j < n; j++ )
			cin >> a[i][j];
	
	double e = -1;
	int ans = -1;
	for( int i = 0; i < m; i++ ){
		double res = solve(i);
		if( e < res ){
			e = res;
			ans = i;
		}
	}
	cout << ans << endl;
	return 0;
}
0