PAT (Basic Level) Practice (中文)- 1035 插入与归并(25 分)

题目链接:点击打开链接

题目大意:略。

解题思路:

1、先检验是否插入,否则就是归并。

2、用 sort 来替代插入和归并排序。

3、注意注意注意:中间两个数相等的情况下,也算排好序,第4个测试点(搞死人了)。

AC 代码

#include<bits/stdc++.h>
#include<cmath>

#define mem(a,b) memset(a,b,sizeof a);
#define INF 0x3f3f3f3f

using namespace std;

typedef long long ll;

const int maxn=110;

int n;
int a[maxn], b[maxn];

void Insertion_Sort(int last)
{
    sort(b,b+last);
}

void Merge_Sort(int t[],int len)
{
    for(int i=0;i<n;i+=len)
        if(i+len<=n) sort(t+i,t+i+len);
        else sort(t+i,t+n);
}

int eq()
{
    for(int i=0;i<n;i++) if(a[i]!=b[i]) return 0;
    return 1;
}

int main()
{
    while(~scanf("%d",&n))
    {
        for(int i=0;i<n;i++) scanf("%d",&a[i]);
        for(int i=0;i<n;i++) scanf("%d",&b[i]);

        int l=1;
        for(int i=1;i<n;i++)
            if(b[i] >= b[i-1]) l++; // 千万别忘记等号的情况,第四个测试点专搞你这个
            else break;

        int f=1;
        for(int i=l;i<n;i++) if(a[i]!=b[i]){ f=0; break; }

        if(f)
        {
            puts("Insertion Sort");
            Insertion_Sort(l+1);
        }
        else
        {
            puts("Merge Sort");
            for(int i=2;i<=n;i*=2)
                if(eq()){ Merge_Sort(b,i); break; }
                else Merge_Sort(a,i);
        }

        printf("%d",b[0]);
        for(int i=1;i<n;i++) printf(" %d",b[i]);
        puts("");
    }

    return 0;
}

猜你喜欢

转载自blog.csdn.net/Dream_Weave/article/details/81408671