PAT A1029

clipboard.png
起先本身想嘗試性的直接排序找中位數,內存直接超限;ios

其實這道題能夠採用歸併排序的思路來作:
可是示例依舊白給。。。不過仍是展示了一種思想,代碼以下:spa

#include<iostream>
#include<stdlib.h>
#include<stdio.h>
#include<vector>
#include<algorithm>
using namespace std;
using std::vector;
const int maxn=1000010;
const int INF=0x7fffffff;
int a[maxn];
int b[maxn];
int main(){
    int n,m;
    scanf("%d",&n);
    int index=0;
    for(int i=0;i<n;i++){
        scanf("%d",&a[i]);
    }
    scanf("%d",&m);
    for(int i=0;i<m;i++){
        scanf("%d",&b[i]);
    }
    a[n]=b[m]=INF;
    int i=0,j=0,ct=0;
    int mid=(m+n-1)/2;
    while(ct<mid){
        if(a[i]<b[j]){
            i++;
        }else
            j++;
        ct++;
    }
    if(a[i]<b[j]){
        printf("%d\n",a[i]);
    }else{
        printf("%d\n",b[j]);
    }
    system("pause");
    return 0;
}

網上給出了一種示例,可以徹底AC;code

#include <iostream>
using namespace std;
int k[200005];
int main(){
    int n, m, temp, count = 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", &temp);
        while (k[i] < temp) {
            count++;
            if (count == midpos) cout << k[i];
            i++;
        }
        count++;
        if (count == midpos) cout << temp;
    }
    while (i <= n) {
        count++;
        if (count == midpos) cout << k[i];
        i++;
    }
    return 0;
}

具體的思路就是,輸入第一個序列;
在輸入第二個序列的時候進行判斷,主要的判斷邏輯爲:
若是輸入的值小於第一個序列的相應值,cout++,跳過該值;
若是大於相應值,進行向後判斷,cout計算增長的值;
若是發現途中cout的值等於中點值,直接進行輸出,程序中止;排序

相關文章
相關標籤/搜索