1089 Insert or Merge (25 point(s))

#include<iostream>
#include<cstdio>
#include<algorithm>
#include<cstring>
using namespace std;
const int MAXN = 1e3 + 10;
int a[MAXN], b[MAXN], t[MAXN];
int n;
bool isInsert() {
	memcpy(t, a, sizeof(a));
	for(int i = 2; i <= n; ++i) { //注意第一遍插入排序是两个元素。 
		sort(t, t + i);
		if(equal(t, t + n, b)) {
			sort(t, t + i + 1); return true;
		}
	}
	return false;
} 
bool isMerge() {
	memcpy(t, a, sizeof(a));
	for(int step = 2; step < n; step *= 2) {
		for(int i = 0; i < n; i += step) {
			sort(t + i, i + step < n ? t + i + step : t + n);
		}
		if(equal(t, t + n, b)) {
			for(int i = 0; i < n; i += step * 2) {
				sort(t + i, i + 2 * step < n ? t + i + step * 2 : t + n); 
			}
			return true;
		}
	}
	return false;
}
int main() {
	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]);
	if(isInsert()) {
		printf("Insertion Sort\n");
	} else if(isMerge()){
		printf("Merge Sort\n");
	}
	for(int i = 0; i < n; ++i) printf("%d%c", t[i], i == n - 1 ? '\n' : ' ');
	return 0;
}

 

相关文章: