首页 > 编程语言 >PAT_甲级_1029 Median (25分) (C++)【求中位数/递增序列合并】

PAT_甲级_1029 Median (25分) (C++)【求中位数/递增序列合并】

时间:2022-10-27 16:02:25浏览次数:54  
标签:25 PAT num1 index Median mid ans input size


目录

​1,题目描述​

​题目大意​

​2,思路​

​3,代码​


1,题目描述

PAT_甲级_1029 Median (25分) (C++)【求中位数/递增序列合并】_PAT

Sample Input:

4 11 12 13 14
5 9 10 15 16 17

 

Sample Output:

13

题目大意

求两递增序列的中位数(合并之后的)。

 

2,思路

递增序列合并,而且只需输出中位数即可(位于(num1+num2+1)/ 2的元素)。

  • 先接受第一行数据,并计算出mid;
  • 逐个接受第二行数据temp。当数组1当前下标对应的元素小于temp时,就将其放入vector<int> ans中,否则将temp放入ans中。直到ans.size()达到mid时,输出ans[mid-1]。
  • 若第二个数组提前遍历完毕(测试点6),遍历第一个数组的剩余元素,直到ans.size()==mid时,输出ans[mid-1]。

3,代码

#include<iostream>
#include<vector>
#include<algorithm>
using namespace std;

int main(){
//#ifdef ONLINE_JUDGE
//#else
// freopen("1.txt", "r", stdin);
//#endif

int num1, num2, index = 0, mid;
int input[200001], tem;
vector<int> ans;
scanf("%d", &num1);
for(int i = 0; i < num1; i++) scanf("%d", &input[i]);

scanf("%d", &num2);
mid = (num1 + num2 + 1) / 2; //中位数的位置

for(int i = 0; i < num2; i++){
scanf("%d", &tem);
while(index < num1 && input[index] <= tem){
ans.push_back(input[index++]);
if(ans.size() == mid){ //只要达到mid就输出
cout<<ans[mid - 1];
return 0;
}
}
ans.push_back(tem);
if(ans.size() == mid){ //只要达到mid就输出
cout<<ans[mid - 1];
return 0;
}
}
while(index < num1){ //若第二个数组已经遍历完毕 仍未到达mid
ans.push_back(input[index++]);
if(ans.size() == mid){
cout<<ans[mid - 1];
return 0;
}
}


return 0;
}

 

标签:25,PAT,num1,index,Median,mid,ans,input,size
From: https://blog.51cto.com/u_15849465/5801389

相关文章