1089 Insert or Merge (25 分)【难度: 一般 / 知识点: 模拟】

在这里插入图片描述
https://pintia.cn/problem-sets/994805342720868352/problems/994805377432928256

#include<bits/stdc++.h>
using namespace std;
const int N=1e5*3+10;
int n,x,flag;
vector<int>a,b,c;
void solve1()
{
    
    
    c=a;
    for(int i=1;i<n;i++)
    {
    
    
        int j=i;
        while(j&&c[j-1]>c[j]) swap(c[j-1],c[j]),j--;
        if(c==b) 
        {
    
    
            flag=true;
            int j=i+1;
            while(j&&c[j-1]>c[j]) swap(c[j-1],c[j]),j--;
            break;
        }
    }
}
void solve2()
{
    
    
    c=a;
    for(int i=2;i<=n;i*=2)
    {
    
    
        for(int j=0;j+i<=n;j+=i) sort(c.begin()+j,c.begin()+j+i);
        if(n%i) sort(c.begin()+n/i*i,c.end());
        if(c==b)
        {
    
    
            i=i*2;
            for(int j=0;j+i<=n;j+=i) sort(c.begin()+j,c.begin()+j+i);
            if(n%i) sort(c.begin()+n/i*i,c.end());
            break;
        }
    }
}
int main(void)
{
    
    
    cin>>n;
    for(int i=0;i<n;i++) cin>>x,a.push_back(x);
    for(int i=0;i<n;i++) cin>>x,b.push_back(x);
    solve1();
    if(flag) puts("Insertion Sort");
    else
    {
    
    
        solve2();
        puts("Merge Sort");
    }
    for(int i=0;i<c.size();i++) 
    {
    
    
        cout<<c[i];
        if(i+1!=c.size()) cout<<" ";
    }
    return 0;
}

Guess you like

Origin blog.csdn.net/qq_46527915/article/details/121317751