2016级算法第一次练习赛-B.朴素的中位数
朴素的中位数
题目链接: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.朴素的中位数的更多相关文章
- 2016级算法第一次练习赛-C.斐波那契进阶
870 斐波那契进阶 题目链接:https://buaacoding.cn/problem/870/index 思路 通过读题就可以发现这不是一般的求斐波那契数列,所以用数组存下所有的答案是不现实的. ...
- 2016级算法第一次练习赛-F.AlvinZH的儿时梦想——机器人篇
864 AlvinZH的儿时梦想----机器人篇 题目链接:https://buaacoding.cn/problem/868/index 思路 中等题. 判断无限玩耍: \(p\) 的值能够承担的起 ...
- 2016级算法第一次练习赛-E.AlvinZH的儿时回忆——蛙声一片
864 AlvinZH的儿时回忆----蛙声一片 题目链接:https://buaacoding.cn/problem/865/index 思路 中等题.难点在于理解题意!仔细读题才能弄懂题目规则.整 ...
- 2016级算法第一次练习赛-D.AlvinZH的儿时回忆——跳房子
864 AlvinZH的儿时回忆----跳房子 题目链接:https://buaacoding.cn/problem/864/index 思路 这是一道简单题,但是同样有人想复杂了,DP?大模拟?. ...
- 2016级算法第一次练习赛-A.群鸦的盛宴
858 群鸦的盛宴 题目链接:https://buaacoding.cn/problem/858/index 思路 本题乍一眼看过去,你可能会想到使用一个二维数组A[51][51]来记录从i到j的路线 ...
- 2016级算法期末模拟练习赛-F.AlvinZH的青春记忆IV
1086 AlvinZH的青春记忆IV 思路 难题,动态规划. 这是一道很有意思的题,因为它不仅卡了时间,也卡了空间,而且卡的很妙很迷. 光是理解题意已经有点难度,简化题意:两串数字序列,相等的数字定 ...
- 2016级算法期末模拟练习赛-E.AlvinZH的青春记忆III
1083 AlvinZH的青春记忆III 思路 难题,二分图. 说这是一个考察二分图的题目,你可以会说"不可能",这哪里像一个二分图了!这真的是一个二分图,考察的是最小顶点覆盖. ...
- 2016级算法期末模拟练习赛-D.AlvinZH的序列问题
1111 AlvinZH的序列问题 思路 中等题,动态规划. 简化题意,. 坑点一:二维int数组MLE,明显会超过内存限制,由于\(n\)最大为1e4,那么我们的dp数组最大也是1e4,考虑使用sh ...
- 2016级算法期末模拟练习赛-B.AlvinZH的青春记忆I
1083 AlvinZH的青春记忆I 思路 中等题,动态规划. 简化题意,一个环上取数,数不可相邻,取取得数之和最大值. 环不好表示,可以解开变成一列数,那么答案应为下列两种情况较大者. ①:取第一个 ...
随机推荐
- 详解python包管理器pip安装
pip对于使用python的朋友并不陌生,当你想安装python模块的时候一定会首先想到它.pip 是一个安装和管理 Python 包的工具 , 是 easy_install 的一个替换品. 今天来说 ...
- sql复制表结构,复制表内容语句
sql复制表结构,复制表内容语句 select * into b from a where 1<>1 select top 0 * into b from a insert into a ...
- Java Persistence with MyBatis 3(中文版) 第一章 MyBatis入门
本章将涵盖以下话题: ž MyBatis是什么? ž 为什么选择MyBatis? ž MyBatis安装配置 ž 域模型样例 1.1 MyBatis是什么 MyBatis是一个简化和实现了Ja ...
- Maven常用配置
运行mvn install时跳过Test 方法一: <project> [...] <build> <plugins> <plugin> <gro ...
- 网站如何集成Facebook和Twitter第三方登录
最近公司要求做海外的第三方登录:目前只做了Facebook和Twitter;国内百度到的信息太少VPN FQ百度+Google了很久终于弄好了.但是做第三方登录基本上都有个特点就是引入必须的js,设置 ...
- kalilinux系统设置
echo LANG="zh_CN.UTF-8" > /etc/default/locale
- Android 65536方法数限制的思考
前言 没想到,65536真的很小. 1 Unable to execute dex: method ID not in [0, 0xffff]: 65536 PS:本文只是纯探索一下这个65K的来源, ...
- Java多线程设计模式(一)
目录(?)[-] Java多线程基础 Thread类的run方法和start方法 线程的启动 线程的暂时停在 线程的共享互斥 线程的协调 Single Threaded Execution Patte ...
- git 恢复被修改的文件
恢复到最后一次提交的改动: git checkout filename 如果该文件已经 add 到暂存队列中,恢复文件: git reset HEAD filename
- Arduino I2C + 三轴加速度计ADXL345
ADXL345是ADI公司生产的三轴数字加速度计芯片,与ST的LIS3DH功能接近.主要特性有: 工作电压:2.0 ~ 3.6V 功耗:待机功耗0.1μA:工作时与数据输出频率(ODR)有关,如ODR ...