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 思路 中等题,动态规划. 简化题意,一个环上取数,数不可相邻,取取得数之和最大值. 环不好表示,可以解开变成一列数,那么答案应为下列两种情况较大者. ①:取第一个 ...
随机推荐
- spring mabatis springmvc 看过
.Spring中AOP的应用场景.Aop原理.好处? 答:AOP--Aspect Oriented Programming面向切面编程:用来封装横切关注点,具体可以在下面的场景中使用: Authent ...
- loadrunner12-错误 -26366: 找不到 web_reg_find 的“Text=19728.00”
转:检查点(web_reg_find函数详解) LR检查点 设置检查点的目的不只是为了验证我们的脚本没有错误,而更重要的是一个规范问题,如何使得测试结果更具有说服力,因此建议所有的测试脚本中都添加检查 ...
- 粗略了解fill与fill_n
以前只知道数组赋值时用memset(): 而这几天却了解到了一个函数:fill(); 感觉以后会有用吧... std::fill template <class ForwardIterator, ...
- [SoapUI] SOAP UI-Groovy Useful Commands
Hi All, I have posted the SOAPUI and Groovy useful commands that may help you in your testing. Below ...
- 一些命令可以帮您了解Linux 操作系统用户信息
1 显示上次登录的用户信息列表,包括(登录时间.退出时间.登录IP): [sywu@wusuyuan ~]$ last root pts/1 192.168.1.3 Wed Aug 27 22:08 ...
- shared_ptr / weak_ptr 代码片段
参考<<Boost程序库完全开放指南>> shared_ptr 类摘要(只列出了常用的部分)和相关说明 template <class T> class shar ...
- PLSA算法(转)
文章分类:综合技术 1. 引子 Bag-of-Words 模型是NLP和IR领域中的一个基本假设.在这个模型中,一个文档(document)被表示为一组单词(word/term)的无序组合,而忽略了语 ...
- Introducing .NET Standard
https://blogs.msdn.microsoft.com/dotnet/2016/10/18/the-week-in-net-bond-the-gallery/ .NET Standard s ...
- 金牌选手zzy的卡常头文件
一定要粘上去啊,亲测快两倍 #pragma GCC diagnostic error "-std=c++11" #pragma GCC optimize("-fdelet ...
- LVM与RAID阵列
创建LVM分区: 相关命令: pvcreat /dev/sdb{1,2,3} 创建物理卷 vgcreat test_vg1 /dev/sdb1 创建卷组 vgcreat test_vg2 -s ...