PAT1089. Insert or Merge

PAT1089. Insert or Merge

题目大意

给定一个初始序列src, 一个排序当中的序列tar, 问排序方式是 Insert Sort, 或者 Merge Sort. 并输出下一次迭代排序的序列, 保证答案唯一.

思路

由于保证了答案的唯一性, 所以先检测是否是 Insert Sort, 只要检测第一个出现不递增的序列的位置之后, src 和 tar 是否相等.

如果是 Merge Sort, (需要注意此处的 Merge Sort 不是二分实现的), 需要自己手动模拟 Merge Sort 的过程, 这里考察一个 按照 k 的大小分割一个区间

	for(int i = 0; i < n / k; i++)
	    func(i + k, (i + 1) * k);
	func(n / k * k, n);

代码

#include <iostream>
#include <cstdio>
#include <algorithm>
#include <vector>
using namespace std;
int nNum;
vector<int> src, tar;
bool eq(){
    for(int i = 0; i < nNum; i++)
        if(src[i] != tar[i])
            return false;
    return true;
}
int main(){
    scanf("%d", &nNum);
    src.resize(nNum); tar.resize(nNum);
    int i, j;
    for(i = 0; i < nNum; i++) cin >> src[i];
    for(i = 0; i < nNum; i++) cin >> tar[i];

    for(i = 0; i < nNum - 1 && tar[i] <= tar[i + 1]; i++);
    for(j = i + 1; j < nNum && tar[j] == src[j]; j++);

    if(j == nNum){
        cout << "Insertion Sort" << endl;
        sort(src.begin(), src.begin() + i + 2);
    }
    else{
        cout << "Merge Sort" << endl;
        int k = 1, flag = 1;
        while(flag){
            flag = !eq();
            k *= 2;
            for(int i = 0; i < nNum / k; i++)
                sort(src.begin() + i * k, src.begin() + (i + 1) * k);
            sort(src.begin() + nNum / k * k, src.end());
        }
    }
    for(int i = 0; i < nNum; i++){
        printf("%s%d", i == 0 ? "" : " ", src[i]);
    }
    return 0;
}



posted @ 2017-11-27 20:29  1pha  阅读(168)  评论(0编辑  收藏  举报