美文网首页
A1029 Median (25分)

A1029 Median (25分)

作者: km15 | 来源:发表于2020-02-06 17:57 被阅读0次

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;
}

相关文章

网友评论

      本文标题:A1029 Median (25分)

      本文链接:https://www.haomeiwen.com/subject/kayuxhtx.html