题目:
寻找中位数
TimeLimit:1000MS MemoryLimit:128MB
64-bit integer IO format:%lld
Problem Description
这题温暖大家的心(手动滑稽.jpg我看能收割多少个wa)
给定n个整数,求这些整数的中位数。
注意:若n为偶数,输出从小到大排序后最中间的两个数的平均数向下取整的结果.
其中向下取整的定义 :x的向下取整 = 不大于x的最大整数
Input
单组数据
第一行包含一个整数n,代表有n的整数
接下来一行有n个整数 a1,a2,a3……an
1<=n<=106
保证所有整数都在int 范围内。
后台共有4组n=1e6级别的大数据。
测评机的测评时间,是累加所有测试点的耗时的
Output
输出一个整数代表中位数
SampleInput
4 -4 -2 -1 -3
SampleOutput
-3
注意:
1.向下取整应该用 >>1,不要用”/2” “/2”是向零取整
2.int+int 会爆int
3.应该使用线性选择算法
AC代码:
- #include<stdio.h>
- #include<string.h>
- #include<algorithm>
- #include<math.h>
- #include<map>
- #include<unordered_set>
- using namespace std;
- typedef long long ll;
- int a[1000005];
- int main(){
- int i,j,n,m,k;
- ll x,y;
- scanf("%d",&n);
- for(int i=1;i<=n;i++)
- scanf("%d",&a[i]);
- if(n%2==1){//奇数
- k=(n+1)/2;
- nth_element(a+1,a+k,a+1+n);
- printf("%d\n",a[k]);
- }
- else{
- k=n/2;
- nth_element(a+1,a+k,a+1+n);
- for(int i=1;i<=n;i++)
- printf("%d ",a[i]);
- printf("\n");
- x=a[k];
- k++;
- nth_element(a+1,a+k,a+1+n);
- // start, ,end
- //使第k大元素位于第k位置,
- //并且比这个元素大的元素都排在这个元素之后,
- //但不能保证他们是有序的
- for(int i=1;i<=n;i++)
- printf("%d ",a[i]);
- printf("\n");
- y=a[k];
- x=x+y;
- x>>=1;
- //>>是右移运算符
- //<<是左移运算符
- //等同于
- //向下取整应该用 >>1
- //“/2”是向零取整
- printf("%d\n",(int)x);
- }
- return 0;
- }