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;
}