include <iostream>
using namespace std;
/* run this program using the console pauser or add your own getch, system("pause") or input loop
题意:找中间位置
1、合并两个序列,递增地合并,然后找出中间那个
2、两个序列最大为2*10的5次方,然后是数字在 long long的范围内
解题:
1、输入两个序列
2、然后合并,
3、找出中间那个,输出,两数列元素直接相加,除2即可
learn && wrong:
1、没有指明所有元素都不同
2、定义的元素,函数名打错,
3、函数参数没传!
4、N + M - 1,要减一,从0开始的
5、>>1,代表左移1一位,不是>>2
6、两个样例错了!不知道错哪里
7、标准答案有一些learn,见下面
*/
const int maxn = 200010;
long long array1[maxn], array2[maxn];
long long array3[2 * maxn];
void merge(long long a[], int n1, long long b[], int n2) {
int temp = 0, i = 0, j = 0;
while (i < n1 && j < n2) {
if (a[i] <= b[j]) {
array3[temp++] = a[i++];
}
else {
array3[temp++] = b[j++];
}
}
while (i < n1) array3[temp++] = a[i++];
while (j < n2) array3[temp++] = b[j++];
}
int main(int argc, char** argv) {
//输入两个数组
int n1, n2;
cin >> n1;
for (int i = 0;i < n1;++i) {
scanf("%d", &array1[i]);
}
cin >> n2;
for (int i = 0;i < n2;++i) {
scanf("%d", &array2[i]);
}
merge(array1, n1, array2, n2);
int median = (n1 + n2) >> 1;
/*for (int i = 0;i < n1 + n2;++i) {
cout << array3[i] << " ";
}
cout << endl;*/
cout << array3[median] << endl;
return 0;
}
learn && wrong:
1、只要求输出中位数,所以可以不合并,只要弄个计数器count++到中位数就可以,
比较两个,s1小,i++,s2小,j++
2、int类型的最大值是2的31次-1,可以写成(1<<31)-1
3、为了使代码简练,可以在序列后面添加很大的值,也就是int最大,可以防止序列已经扫描完但count还没到中位数越界的情况。这个真的挺强的,本质是什么呢
本质是,末尾最大值,一旦一个序列到了末尾,就跳到另一个,因为不可能比你大,
本质也就是if+末尾INF
4、使用cin和cout会超时,所以用scanf
5、最后仍要判断一次,是因为到中位数的时候,跳出时候没有判断
#include <iostream>
using namespace std;
const int maxn = 200010;
long long array1[maxn], array2[maxn];
const int INF = 0x7fffffff;
int main(int argc, char** argv) {
//输入两个数组
int n1, n2;
cin >> n1;
for (int i = 0;i < n1;++i) {
scanf_s("%d", &array1[i]);
}
cin >> n2;
for (int i = 0;i < n2;++i) {
scanf_s("%d", &array2[i]);
}
array1[n1] = INF;
array2[n2] = INF;
int medianPOS = (n1 + n2 - 1) / 2;
int i =0, j = 0, count = 0;
while (count < medianPOS) {
if (array1[i] < array2[j]) i ++;
else j++;
count++;
}
if (array1[i] < array2[j]) {
cout << array1[i];
}
else {
cout << array2[j];
}
return 0;
}
网友评论