强烈推荐,刷PTA的朋友都认识一下柳神–PTA解法大佬
本文由参考于柳神博客写成
还有就是非常非常有用的 算法笔记 全名是
算法笔记 上级训练实战指南 //这本都是PTA的题解
算法笔记
PS 今天也要加油鸭
题目原文
Given an increasing sequence S of N integers, the median is the number at the middle position. For example, the median of S1 = { 11, 12, 13, 14 } is 12, and the median of S2 = { 9, 10, 15, 16, 17 } is 15. The median of two sequences is defined to be the median of the nondecreasing sequence which contains all the elements of both sequences. For example, the median of S1 and S2 is 13.
Given two increasing sequences of integers, you are asked to find their median.
Input Specification:
Each input file contains one test case. Each case occupies 2 lines, each gives the information of a sequence. For each sequence, the first positive integer N (≤2×105) is the size of that sequence. Then N integers follow, separated by a space. It is guaranteed that all the integers are in the range of long int.
Output Specification:
For each test case you should output the median of the two given sequences in a line.
Sample Input:
4 11 12 13 14
5 9 10 15 16 17
Sample Output:
13
题目大意:
给出两个已经递增的序列S1和S2,长度分别为N和M.求将它们合并一个新的递增序列后的中位数(个数为偶数时为左半部分的最后一个数)
代码如下:
#include<iostream>
const int maxn = 1000010; //序列最大长度
const int INF = 0x7fffffff; //int上限
int S1[maxn], S2[maxn]; //两个递增序列
int main() {
int n, m;
scanf("%d", &n);
for (int i = 0; i < n; ++i) {
scanf("%d", &S1[i]); //输入第一个序列
}
scanf("%d", &m);
for (int i = 0; i < m; ++i) {
scanf("%d", &S2[i]); //输入第二个序列
}
S1[n] = S2[m] = INF; //两个序列的最后一个元素设为int上限
int medianPos = (n + m - 1) / 2; //medianPos为中键位置
int i = 0, j = 0, count = 0; //count计数当前的位置数
while (count < medianPos) { //只要count未达到medianPos,就继续循环
if (S1[i] < S2[j]) ++i; //S1[i]更小,则选择S1[i]
else ++j; //S2[j]更小,则选择S2[j]
count++; //count加1
}
if (S1[i] < S2[j]) { //输出两个序列当前位置较小的元素
printf("%d\n", S1[i]);
}
else {
printf("%d\n", S2[j]);
}
return 0;
}