【PAT甲级】1089 Insert or Merge (25 分)(插入排序和归并排序)

题意:

输入一个正整数N(<=100),接着输入两行N个整数,第一行表示初始序列,第二行表示经过一定程度的排序后的序列。输出这个序列是由插入排序或者归并排序得到的,并且下一行输出经过再一次排序操作所得到的序列。数据保证了不会有两种排序方式都可以得到的序列。

AAAAAccepted code:

 1 #define HAVE_STRUCT_TIMESPEC
 2 #include<bits/stdc++.h>
 3 using namespace std;
 4 int a[107];
 5 int b[107];
 6 int main(){
 7     ios::sync_with_stdio(false);
 8     cin.tie(NULL);
 9     cout.tie(NULL);
10     int n;
11     cin>>n;
12     for(int i=1;i<=n;++i)
13         cin>>a[i];
14     for(int i=1;i<=n;++i)
15         cin>>b[i];
16     int pos=0;
17     for(int i=n;i;--i)
18         if(a[i]!=b[i]){
19             pos=i;
20             break;
21         }
22     int flag=1;
23     int loc=0;
24     for(int i=1;i<n;++i)
25         if(b[i]>b[i+1]){
26             loc=i;
27             break;
28         }
29     for(int i=loc+1;i<=n;++i)
30         if(a[i]!=b[i]){
31             flag=0;
32         }
33     if(flag){
34         cout<<"Insertion Sort
";
35         sort(a+1,a+1+loc+1);
36         for(int i=1;i<=n;++i){
37             cout<<a[i];
38             if(i<n)
39                 cout<<" ";
40         }
41     }
42     else{
43         cout<<"Merge Sort
";
44         int t=1;
45         while(1){
46             int flag=0;
47             for(int i=1;i<=n;++i)
48                 if(a[i]!=b[i]){
49                     flag=1;
50                     break;
51                 }
52             t*=2;
53             for(int i=1;i<=n/t;++i)
54                 sort(a+(i-1)*t+1,a+i*t+1);
55             sort(a+n/t*t+1,a+n+1);
56             if(!flag)
57                 break;
58         }
59         for(int i=1;i<=n;++i){
60             cout<<a[i];
61             if(i<n)
62                 cout<<" ";
63         }
64     }
65     return 0;
66 }
保持热爱 不懈努力 不试试看怎么知道会失败呢(划掉) 世上无难事 只要肯放弃(划掉)
原文地址:https://www.cnblogs.com/ldudxy/p/11901958.html