結果

問題 No.335 門松宝くじ
ユーザー startcppstartcpp
提出日時 2016-01-15 23:36:46
言語 C++11
(gcc 11.4.0)
結果
AC  
実行時間 1,274 ms / 2,000 ms
コード長 1,372 bytes
コンパイル時間 505 ms
コンパイル使用メモリ 59,432 KB
実行使用メモリ 8,692 KB
最終ジャッジ日時 2023-10-19 23:39:43
合計ジャッジ時間 2,508 ms
ジャッジサーバーID
(参考情報)
judge15 / judge13
このコードへのチャレンジ
(要ログイン)

テストケース

テストケース表示
入力 結果 実行時間
実行使用メモリ
testcase_00 AC 3 ms
5,736 KB
testcase_01 AC 2 ms
5,736 KB
testcase_02 AC 2 ms
5,744 KB
testcase_03 AC 2 ms
5,748 KB
testcase_04 AC 2 ms
5,740 KB
testcase_05 AC 7 ms
8,436 KB
testcase_06 AC 9 ms
8,436 KB
testcase_07 AC 13 ms
8,692 KB
testcase_08 AC 1,274 ms
8,692 KB
testcase_09 AC 20 ms
8,692 KB
testcase_10 AC 18 ms
8,692 KB
testcase_11 AC 19 ms
8,692 KB
testcase_12 AC 20 ms
8,692 KB
testcase_13 AC 19 ms
8,692 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[801][801];
	static int maxi[801][801];
	
	for( i = 1; i <= n; i++ ){
		for( j = 1; 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