1. 程式人生 > >upc3577誰會贏?(排序)

upc3577誰會贏?(排序)

問題 T: 【排序】誰會贏?

時間限制: 3 Sec  記憶體限制: 64 MB

題目描述

最近,在課餘時間流行一種遊戲,遊戲的規則如下:遊戲開始時,每個人都從規定範圍內的數中選取一個數(保證所選取的數各不相同),寫在紙上,握在手中(以防讓別的同學看見),然後同時開啟,如果其中一個同學手中的數是其他任意兩位同學手中的數之和,那麼他就贏,如果滿足條件的有多個,手中的數最大的那位同學贏。這是心理和智力的雙重考驗,所以參加的學生越來越多,但是,由於參與人數眾多,要判斷誰贏就成了問題,請聰明的你設計一個程式來解決這個問題!

 

輸入

第1行為一個整數N(3≤N≤50000),表示參加遊戲的總人數,第2行為N個數(範圍在0~2^31之間),依次表示N個同學所選的數,第i個數表示第i位同學所選的數。

 

輸出

只一行,為一個整數,表示哪位同學贏。如果沒有任何一位同學贏,則輸出“0”。

 

樣例輸入

複製樣例資料

5
2 5 7 3 13 

樣例輸出

3

 

提示

 

100%的資料:N≤50000

/**/
#include <cstdio>
#include <cstring>
#include <cmath>
#include <cctype>
#include <iostream>
#include <algorithm>
#include <map>
#include <set>
#include <vector>
#include <string>
#include <stack>
#include <queue>

typedef long long LL;
using namespace std;

int n;
map<LL, int> mp;

struct node
{
	int id;
	LL num;
	bool operator <(const node &x)const{
		return num < x.num;
	}
}a[50005];

int main()
{
	//freopen("in.txt", "r", stdin);
	//freopen("out.txt", "w", stdout);

	scanf("%d", &n);
	for (int i = 1; i <= n; i++) scanf("%lld", &a[i].num), a[i].id = i, mp[a[i].num] = 1;
	sort(a + 1, a + 1 + n);
	int flag = 0;
	for (int i = n; i >= 1; i--){ //預先把所有可能情況存起來會暴空間
		if(flag) break;
		for (int j = i - 1; j >= 1; j--){
			if(mp[a[i].num - a[j].num] && 2 * a[j].num != a[i].num && a[j].num != 0){//少一個條件就錯
				printf("%d\n", a[i].id);
				flag = 1;
				break;
			}
		}
	}
	if(!flag) printf("0\n");

	return 0;
}
/**/