写在前面
- 实现思路
-
vector<int> vn(n);
封装序列1 -
vn.resize(n+m);
封装序列2 -
sort
排序,去中间下标对应值
- 10分钟a题目
测试用例
input:
4 11 12 13 14
5 9 10 15 16 17
output:
13
input:
3 1 1 1
3 2 2 2
output:
1
ac代码
#include <vector>
#include <iostream>
#include <algorithm>
using namespace std;
int main()
{
int n,m, tmp, cnt = 0;
cin >> n;
vector<int> vn(n);
for(int i=0; i<n; i++) scanf("%d", &vn[i]);
cin >> m;
vn.resize(n+m);
for(int i=n; i<m+n; i++) scanf("%d", &vn[i]);
sort(vn.begin(), vn.end());
printf("%d", vn[(m+n+1)/2-1]);
return 0;
}
学习代码
- 思路分析
- 开1个数组,在线处理第1个数组。
- 从小到大数找到(n + m + 1) / 2位置对应哪个组,输出具体值
- cnt计数,第1个数组设置指针i,每次从第2个数组中读⼊tmp,检查第1个数组中前几个数是否比tmp小
- 小,cnt+1并判断是否为中间数,是就输出
- 数完比temp小的数未到中间数,cnt+1。检查tmp是不是中间数,是就输出
- 循环上述过程。如果第2个数组读取完,还未到中间数,说明中间数在剩下1个数组中,在剩下的数组中数到中间数位置即可
#include <iostream>
using namespace std;
int k[200005];
int main()
{
int n, m, tmp, cnt = 0;
cin >> n;
for (int i = 1; i <= n; i++)
scanf("%d", &k[i]);
k[n + 1] = 0x7fffffff;
cin >> m;
int midpos = (n + m + 1) / 2, i = 1;
for (int j = 1; j <= m; j++)
{
scanf("%d", &tmp);
while (k[i] < tmp)
{
cnt++;
if (cnt == midpos)
{
cout << k[i];
return 0;
}
i++;
}
cnt++;
if (cnt == midpos)
{
cout << tmp;
return 0;
}
}
while (i <= n)
{
cnt++;
if (cnt == midpos)
{
cout << k[i];
break;
}
i++;
}
return 0;
}
知识点小结
// 跳出1层循环
break;
- vector数组合并
#include <vector>
#include <iostream>
#include <algorithm>
using namespace std;
int main()
{
vector<int>vec1(2),vec2(2),vec3,vec4(5);
vec1[0]=1;
vec1[1]=2;
vec2[0]=11;
vec2[1]=12;
vec3.insert(vec3.begin(),vec1.begin(),vec1.end());
vec3.insert(vec3.begin(),vec2.begin(),vec2.end());
for(auto it=vec3.begin(); it!=vec3.end(); it++)
{
cout << *it << " ";
}
cout << endl;
merge(vec1.begin(),vec1.end(),vec2.begin(),vec2.end(),vec4.begin());
for(auto it=vec4.begin(); it!=vec4.end(); it++)
{
cout << *it << " ";
}
return 0;
}