六校联合周赛E

 

题目:

寻找中位数

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;
  • }

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值