結果

問題 No.698 ペアでチームを作ろう
ユーザー cielciel
提出日時 2018-06-09 18:41:40
言語 C++17(clang)
(17.0.6 + boost 1.83.0)
結果
AC  
実行時間 154 ms / 1,000 ms
コード長 1,474 bytes
コンパイル時間 4,397 ms
コンパイル使用メモリ 120,064 KB
実行使用メモリ 5,376 KB
最終ジャッジ日時 2024-05-07 17:42:12
合計ジャッジ時間 2,399 ms
ジャッジサーバーID
(参考情報)
judge4 / judge5
このコードへのチャレンジ
(要ログイン)

テストケース

テストケース表示
入力 結果 実行時間
実行使用メモリ
testcase_00 AC 2 ms
5,248 KB
testcase_01 AC 1 ms
5,376 KB
testcase_02 AC 2 ms
5,376 KB
testcase_03 AC 1 ms
5,376 KB
testcase_04 AC 8 ms
5,376 KB
testcase_05 AC 1 ms
5,376 KB
testcase_06 AC 2 ms
5,376 KB
testcase_07 AC 150 ms
5,376 KB
testcase_08 AC 153 ms
5,376 KB
testcase_09 AC 148 ms
5,376 KB
testcase_10 AC 147 ms
5,376 KB
testcase_11 AC 153 ms
5,376 KB
testcase_12 AC 154 ms
5,376 KB
testcase_13 AC 150 ms
5,376 KB
testcase_14 AC 147 ms
5,376 KB
権限があれば一括ダウンロードができます

ソースコード

diff #

#include <vector>
#include <algorithm>
#include <cstdio>
using namespace std;

template <class BidirectionalIterator>
bool next_combination(BidirectionalIterator first1,
	BidirectionalIterator last1,
	BidirectionalIterator first2,
	BidirectionalIterator last2)
{
	if(( first1 == last1 ) || ( first2 == last2 ))return false;
	BidirectionalIterator m1 = last1;
	BidirectionalIterator m2 = last2; --m2;
	while(--m1 != first1 && !(* m1 < *m2 ));
	bool result = (m1 == first1 ) && !(* first1 < *m2 );
	if(!result){
		while( first2 != m2 && !(* m1 < * first2 ))++first2;
		first1 = m1;
		iter_swap(first1 , first2 );
		++ first1;
		++ first2;
	}
	if(( first1 != last1 ) && ( first2 != last2 )){
		m1 = last1 ; m2 = first2 ;
		while(( m1 != first1 ) && (m2 != last2 )){
			iter_swap (--m1 , m2 );
			++m2;
		}
		reverse(first1 , m1);
		reverse(first1 , last1);
		reverse(m2 , last2);
		reverse(first2 , last2);
	}
	return !result;
}
template <class BidirectionalIterator>
bool next_combination (BidirectionalIterator first,
	BidirectionalIterator middle,
	BidirectionalIterator last)
{return next_combination(first , middle , middle , last);}

int main(){
	int n,r=0;
	scanf("%d",&n);
	vector<int> v(n);
	for(int i=0;i<n;i++)scanf("%d",&v[i]);
	sort(v.begin(),v.end());
	do{
		do{
			int s=0;
			for(int i=0;i<n/2;i++)s+=v[i]^v[i+n/2];
			r=max(s,r);
		}while(next_permutation(v.begin()+n/2,v.end()));
	}while(next_combination(v.begin(),v.begin()+n/2,v.end()));
	printf("%d",r);
}
0