题目链接:点击打开链接
题目大意:略。
解题思路:
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;
}