PTA甲级 1029 Median (25point(s))

强烈推荐,刷PTA的朋友都认识一下柳神–PTA解法大佬

本文由参考于柳神博客写成

柳神的CSDN博客,这个可以搜索文章

柳神的个人博客,这个没有广告,但是不能搜索

还有就是非常非常有用的 算法笔记 全名是

算法笔记  上级训练实战指南		//这本都是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;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值