朴素的中位数

题目链接:https://buaacoding.cn/problem/846/index

分析

题意很简单,就是给定了两个从小到大排好序的数组,找出这两个数组合起来的数据中的中位数。

方法应该比较多,很容易想的比如直接合并成两个数组然后对大数组sort()排序;又因为两个数组都已经是各自有序的了,可以联想一下归并排序中合并数组的方式直接得到有序的大数组,这样会快很多(这也是出这道题的本意);应该也可以用找第k小数的方法利用快排的方式直接找中位数。当然因为没有太卡时间,所以方法随意。

另外:没有指出数组中数据的类型,不注意用了int的话可能得不到全分;以及有数组为空的情况,已经特意指出来了,否则可能会有数组越界等问题。

出错比较多的地方就是在用数组索引求中间数的时候,如果不加注意,a[sum/2-1]就会出现数组下标越界的情况。

代码样例

//Sort版:
#include <iostream>
#include <string.h>
#include <algorithm>
#include<cstdio>
#include<vector>
using namespace std;
vector<long long>v;
int main()
{
int n,m;
long long x;
while(~scanf("%d%d",&n,&m))
{
v.clear();
for(int i = 0;i<n;i++)
{
cin>>x;
v.push_back(x);
}
for(int i = 0;i<m;i++)
{ cin>>x;
v.push_back(x);
}
sort(v.begin(),v.end()); double ans = 0.0;
if(n==0&&m==0)
ans = 0.0;
int l = n+m;
if(l!=0&&l%2==0)
{
ans = (double)(v[l/2]+(double)v[l/2-1])/2;
}
else if(l%2!=0)
ans = (double)(v[l/2]);
printf("%.1lf\n",ans);
}
} 简单给出边合并边排序的方法:
if(n>0&&m>0){
for(int k=0;k<l;k++)
{
if(i<n&&j<m&&num1[i]<=num2[j])
{
num3.push_back(num1[i]);
i++;
}
else if(i<n&&j<m&&num2[j]<num1[i])
{
num3.push_back(num2[j]);
j++;
}
else if(i<n)
{
num3.push_back(num1[i]);i++;
}
else if(j<m)
{
num3.push_back(num2[j]);j++;
}
} if(l%2!=0)ans = (double)num3[l/2];
else ans = (double)(num3[l/2]+(double)num3[l/2-1])/2;
}
else{
if(m==0&&n==0)ans = 0.000;
else if(m==0&&n!=0)
{
if(n%2!=0)ans = (double)num1[n/2];
else ans = (double)((double)num1[n/2]+(double)num1[n/2-1])/2;
}
else{
if(m%2!=0)ans = (double)num2[m/2];
else ans = (double)((double)num2[m/2]+(double)num2[m/2-1])/2;
}
}
printf("%.1f\n",ans);

算法分析

sort对vector的时间复杂度一般为O(nlogn)

后者边合并边排序的方法只需要O(n)

2016级算法第一次练习赛-B.朴素的中位数的更多相关文章

  1. 2016级算法第一次练习赛-C.斐波那契进阶

    870 斐波那契进阶 题目链接:https://buaacoding.cn/problem/870/index 思路 通过读题就可以发现这不是一般的求斐波那契数列,所以用数组存下所有的答案是不现实的. ...

  2. 2016级算法第一次练习赛-F.AlvinZH的儿时梦想——机器人篇

    864 AlvinZH的儿时梦想----机器人篇 题目链接:https://buaacoding.cn/problem/868/index 思路 中等题. 判断无限玩耍: \(p\) 的值能够承担的起 ...

  3. 2016级算法第一次练习赛-E.AlvinZH的儿时回忆——蛙声一片

    864 AlvinZH的儿时回忆----蛙声一片 题目链接:https://buaacoding.cn/problem/865/index 思路 中等题.难点在于理解题意!仔细读题才能弄懂题目规则.整 ...

  4. 2016级算法第一次练习赛-D.AlvinZH的儿时回忆——跳房子

    864 AlvinZH的儿时回忆----跳房子 题目链接:https://buaacoding.cn/problem/864/index 思路 这是一道简单题,但是同样有人想复杂了,DP?大模拟?. ...

  5. 2016级算法第一次练习赛-A.群鸦的盛宴

    858 群鸦的盛宴 题目链接:https://buaacoding.cn/problem/858/index 思路 本题乍一眼看过去,你可能会想到使用一个二维数组A[51][51]来记录从i到j的路线 ...

  6. 2016级算法期末模拟练习赛-F.AlvinZH的青春记忆IV

    1086 AlvinZH的青春记忆IV 思路 难题,动态规划. 这是一道很有意思的题,因为它不仅卡了时间,也卡了空间,而且卡的很妙很迷. 光是理解题意已经有点难度,简化题意:两串数字序列,相等的数字定 ...

  7. 2016级算法期末模拟练习赛-E.AlvinZH的青春记忆III

    1083 AlvinZH的青春记忆III 思路 难题,二分图. 说这是一个考察二分图的题目,你可以会说"不可能",这哪里像一个二分图了!这真的是一个二分图,考察的是最小顶点覆盖. ...

  8. 2016级算法期末模拟练习赛-D.AlvinZH的序列问题

    1111 AlvinZH的序列问题 思路 中等题,动态规划. 简化题意,. 坑点一:二维int数组MLE,明显会超过内存限制,由于\(n\)最大为1e4,那么我们的dp数组最大也是1e4,考虑使用sh ...

  9. 2016级算法期末模拟练习赛-B.AlvinZH的青春记忆I

    1083 AlvinZH的青春记忆I 思路 中等题,动态规划. 简化题意,一个环上取数,数不可相邻,取取得数之和最大值. 环不好表示,可以解开变成一列数,那么答案应为下列两种情况较大者. ①:取第一个 ...

随机推荐

  1. SqlSugar Asp.Net 高性能ORM框架

    SqlSugar从去年到现在已经一年了,版本从1.0升到了现在的2.4.1 ,这是一个稳定版本 ,有数家公司已经项目上线,在这里我将SqlSugar的功能重新整理成一篇新的贴子,希望大家喜欢. 公司团 ...

  2. IOS操作系统上执行monkey测试

    IOS操作系统上执行monkey测试 IOS操作系统不像Android系统那么方便,各种限制也比较多,目前我的建议还是直接在模拟器上执行monkey测试.如果需要在真机上面执行,可以参考文档: htt ...

  3. noi2729 Blah数集

    Blah数集 大数学家高斯小时候偶然间发现一种有趣的自然数集合Blah,对于以a为基的集合Ba定义如下: (1) a是集合Ba的基,且a是Ba的第一个元素: (2)如果x在集合Ba中,则2x+1和3x ...

  4. Use formatter to format your JAVA code

    In order to make the codes looks unified and make it easy to understand, it's better to use the same ...

  5. Inno Setup创建快捷方式跟快速运行栏快捷方式

    [Tasks] Name: "desktopicon"; Description: "{cm:CreateDesktopIcon}"; GroupDescrip ...

  6. .NET开源MSSQL、Redis监控产品Opserver之Exception配置

    异常日志的记录和监控主要依赖于StackExchange.Exceptional组件,默认已经被引进来了. 先看下config文件夹下的ExceptionsSettings.json.example文 ...

  7. 【转载】MYSQL模式匹配:REGEXP和like用法

    转载地址:http://www.webjx.com/database/mysql-32809.html like like要求整个数据都要匹配,而REGEXP只需要部分匹配即可. 也就是说,用Like ...

  8. 关于Markdown格式转PDF格式

    Markdown转PDF格式 个人使用的Markdown编辑平台:有道云笔记网页版 当我们编辑好自己的随笔以后,在网页的[客户端下载]下面有一个[更多]的圆形图标选项,点击后在菜单中有一处[打印]选项 ...

  9. Android AIDL的用法

    一.什么是AIDL服务   一般创建的服务并不能被其他的应用程序访问.为了使其他的应用程序也可以访问本应用程序提供的服务,Android系统采用了远程过程调用(Remote Procedure Cal ...

  10. 修改阿里云ECS服务器的系统时区

    1.前提 由于公司有在印尼的项目,所以购买了阿里云在新加坡机房的服务器(在印尼还没有),印尼当地使用的是东七区的时间,所以领导要求修改阿里云ECS系统的时区. 2.动手 修改阿里云ECS服务器系统的时 ...