1029 Median (25 分)

第一个序列用vector存储起来,第二个序列读入时可同时处理(在线算法)。

需要得到的数(结果)是两个序列组合并后,处于下标(n+m-1)/2的数,所以for循环需要执行(n+m-1)/2次(每次确定一个数)。

 最后输出s2[i-1]或者s2[(n+m-1)/2]即可。

注意此处的处理:

如果输入个数到达上限,且等到最后输入的一个数被选择之后,把t置为无穷,防止再次进入此段代码。

复制代码
 1         if (j >= s1.size() || t < s1[j]) {
 2             s2[k++] = t;
 3             if (s2i == m) {//只有最后一个数被选择之后才会符合此条if语句
 4                 t = INFINITE;
 5             }
 6             if (s2i < m) {
 7                 ++s2i;
 8                 cin >> t;
 9             }
10         }
复制代码

 

复制代码
 1 #pragma warning(disable:4996)
 2 #define _CRT_SECURE_NO_WARNINGS
 3 
 4 #include <iostream>
 5 #include <algorithm>
 6 #include <cmath>
 7 #include <vector>
 8 #include <map>
 9 #include <set>
10 #include <unordered_set>
11 #include <unordered_map>
12 #include <queue>
13 #include <cmath>
14 #include <string>
15 #define INFINITE 2000000000
16 using namespace std;
17 
18 
19 int main() {
20     int n, m;
21     vector<long int> s1, s2;
22     cin >> n;
23     s1.resize(n);
24     for (int i = 0; i < n; ++i) {
25         cin >> s1[i];
26     }
27     cin >> m;
28     int k = 0, j = 0;
29     s2.resize(n + m);
30     int i, t;
31     cin >> t;
32     int s2i = 1;
33     for (i = 0; i < (n + m + 1) / 2; ++i) {
34         if (j >= s1.size() || t < s1[j]) {
35             s2[k++] = t;
36             if (s2i == m) {
37                 t = INFINITE;
38             }
39             if (s2i < m) {
40                 ++s2i;
41                 cin >> t;
42             }
43         }
44         else {
45             s2[k++] = s1[j++];
46         }
47     }
48     cout << s2[i - 1];
49     return 0;
50 }
复制代码

 

posted @   幻想Elapse  阅读(70)  评论(0编辑  收藏  举报
编辑推荐:
· 智能桌面机器人:用.NET IoT库控制舵机并多方法播放表情
· Linux glibc自带哈希表的用例及性能测试
· 深入理解 Mybatis 分库分表执行原理
· 如何打造一个高并发系统?
· .NET Core GC压缩(compact_phase)底层原理浅谈
阅读排行:
· 手把手教你在本地部署DeepSeek R1,搭建web-ui ,建议收藏!
· 新年开篇:在本地部署DeepSeek大模型实现联网增强的AI应用
· Janus Pro:DeepSeek 开源革新,多模态 AI 的未来
· 互联网不景气了那就玩玩嵌入式吧,用纯.NET开发并制作一个智能桌面机器人(三):用.NET IoT库
· 【非技术】说说2024年我都干了些啥
点击右上角即可分享
微信分享提示