upc3577誰會贏?(排序)
阿新 • • 發佈:2018-12-03
問題 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; } /**/