PAT A 1029
来源:互联网 发布:单片机lcd1602程序 编辑:程序博客网 时间:2024/06/06 12:28
题目
给出两个递增数列,找出这两列数合并之后数列的中位数。
这么简单题目通过率只有0.2,一看就是有天坑的。
对中位数定义为奇数时为最中间的一位。偶数时为最中间的两个数的第一个数。
还有数据范围比较大。
I/O
Sample Input
4 11 12 13 14
5 9 10 15 16 17
Sample Output
13
算法
做之前想了好几种数据结构,最后决定用数组直接扫描O(m+n),用slt怕TLE。
对两个数组每个数组初始扫描位置为0,每次扫描时找出当前最小,同时该数组扫描位置向后一位,直到到达中位数的位置,实际为O((m+n)/2)。
细节上有好几个特判:第一列的数全部比第二列大;第一列的数全部比第二列大这两种情况要处理下。
代码
#include<cstdio>long num[2][1000010];int main(){ long len = 0, a, b; scanf("%ld", &a); for(long i = 0; i<a; i++) scanf("%ld", &num[0][i]); len+=a; scanf("%ld", &b); for(long i = 0; i<b; i++) scanf("%ld", &num[1][i]); len+=b; int isOdd = 0; if(len%2) isOdd = 1; long mid = len/2; if(isOdd) mid+=1; //printf("isOdd = %d, len = %ld\n", isOdd, len); //chk pt; long i = 0, j = 0; for(long tmp = 0; tmp<=mid+1; tmp++) { if((num[0][i] <= num[1][j] && i < a) || j == b) { i++; //printf("%d scaned in s1, len = %ld\n", num[0][i-1], i+j); if(i+j == mid) { printf("%ld", num[0][i-1]); break; } } else if(j < b || i == a) { j++; //printf("%d scaned in s2, len = %ld\n", num[1][j-1], i+j); if(i+j == mid) { printf("%ld", num[1][j-1]); break; } } } return 0;}
0 0
- PAT(A) 1029
- PAT A 1029
- PAT-A-https://www.patest.cn/contests/pat-a-practise/1029
- PAT A A+B Format
- pat: 1016 A+B
- PAT [A] 1054
- Pat(A) 1002
- PAT(A) 1005
- PAT(A) 1006
- PAT(A) 1007
- PAT(A) 1008
- PAT(A) 1009
- PAT(A) 1011
- PAT(A) 1012
- PAT(A) 1015
- PAT(A) 1031
- PAT(A) 1035
- PAT(A) 1013
- 顺序储存结构
- 关于应用内主题切换的三种方式
- 二叉树和数组的构造转换
- 四个线程循环输出ABCD
- SpringMVC框架总结
- PAT A 1029
- Linux: xclip,pbcopy,xsel用法 terminal 复制粘帖
- C++内存管理(超长)
- 1619-7 张良 十二月一号总结 [连续第六十二天]
- angular.element
- 嵌入式开发编程修养——C语言篇
- Android自定义控件——自定义控件双击事件
- char a[](字符串数组)和char *a(字符串指针)区别
- 安卓开发之AsyncTask革命性用法,抓住漏洞把情报送进去(原创)