1 #include<stdio.h> 2 #include<stdlib.h> 3 #define MAX 1000010 4 5 int g_a[MAX]; 6 7 int pasition(int number[], int len, int left, int right) 8 { 9 int i = left; 10 int j = right; 11 number[0] = number[i]; 12 while (i < j) 13 { 14 while (i<j && number[j]>number[0]) 15 { 16 j--; 17 } 18 if (i<j) 19 { 20 number[i++] = number[j]; 21 } 22 while (i<j && number[i]<number[0]) 23 { 24 i++; 25 } 26 if (i<j) 27 { 28 number[j--] = number[i]; 29 } 30 } 31 number[i] = number[0]; 32 return i; 33 } 34 35 int get_num(int number[], int len) 36 { 37 int left = 1; 38 int right = len; 39 int mid = len / 2 + 1; 40 int index = pasition(number, len, left, right); 41 while (index != mid) 42 { 43 if (index < mid) 44 { 45 left = index + 1; 46 } 47 else 48 { 49 right = index - 1; 50 } 51 index = pasition(number, len, left, right); 52 } 53 return number[index]; 54 } 55 56 int main() 57 { 58 int t; 59 int n; 60 scanf("%d", &t); 61 while (t--) 62 { 63 scanf("%d", &n); 64 for (int i=1; i<=n; i++) 65 { 66 scanf("%d", &g_a[i]); 67 } 68 printf("%d\n", get_num(g_a,n)); 69 } 70 return 0;
Description |
给定一个n元素的序列,其中存放的都是整数类型的数据。现在保证给出的序列中有一个数,这个数的个数超过整个序列元素总个数的一半,请你找出这个数是多少。
|
Input |
输入数据第一行为一个整数T(T<=15)为测试数据的组数。接下来是T组测试数据。 每组测试数据的第一行为一个整数n(1 <= n <= 1000000)。代表序列中元素的个数。 接下来是序列中存放的n个数值。每个数值的范围在[0,2000000]内。 |
Output |
输出数量过半的那个数字。保证每组数据必有唯一的解。 |
Sample Input |
1 10 2 1 2 3 4 5 2 2 2 2 |
Sample Output |
2 |