1089 Insert or Merge (25分)
这种题总是想很长时间
#include<iostream>
#include<vector>
#include<algorithm>
using namespace std;
int main() {
int n, a[110] = { 0 }, b[110] = { 0 }, flag = 0;
cin >> n;
for (int i = 0; i < n; i++) { cin >> a[i]; }
for (int i = 0; i < n; i++) { cin >> b[i]; }
int cnt1 = 1, cnt2 = 1;
for (cnt1 = 0; cnt1 < n - 1 && b[cnt1] <= b[cnt1 + 1]; cnt1++);
for (cnt2 = cnt1 + 1; a[cnt2] == b[cnt2] && cnt2 < n; cnt2++);
if (cnt2 != n) { flag = 1; }
if (flag == 0) {
cout << "Insertion Sort" << endl;
cnt2 = 1;
for (int i = 1; i < n && b[i] >= b[i - 1]; i++) { cnt2++; }
sort(a, a + cnt2 + 1);
}
else {
cout << "Merge Sort" << endl;
int k = 1, p = 1;
while (p) {
p = 0;
for (int i = 0; i < n; i++) {
if (a[i] != b[i]) {
p = 1;
}
}
k *= 2;
for (int i = 0; i < n/k; i++) {
sort(a + k * i, a + k * i + k);
}
sort(a + (n / k) * k, a + n);
}
}
for (int i = 0; i < n; i++) {
if (i != 0) { cout << ' '; }
cout << a[i];
}
return 0;
}
最后一个测试点错误,参考柳神修改成上面的代码
#include<iostream>
#include<vector>
#include<algorithm>
using namespace std;
int main() {
int n, a[110] = { 0 }, b[110] = { 0 }, flag = 0;
cin >> n;
for (int i = 0; i < n; i++) { cin >> a[i]; }
for (int i = 0; i < n; i++) { cin >> b[i]; }
int cnt1 = 1, cnt2 = 1;
for (cnt1 = 0; cnt1 < n - 1 && b[cnt1] <= b[cnt1 + 1]; cnt1++);
for (cnt2 = cnt1 + 1; a[cnt2] == b[cnt2] && cnt2 < n; cnt2++);
if (cnt2 != n) { flag = 1; }
if (flag == 0) {
cout << "Insertion Sort" << endl;
cnt2 = 1;
for (int i = 1; i < n && b[i] >= b[i - 1]; i++) { cnt2++; }
sort(a, a + cnt2 + 1);
}
else {
cout << "Merge Sort" << endl;
cnt1 = 1e9;
for (int i = 0, j = 1; i < n; i += j) {
for (j = i + 1; j < n && b[j] >= b[j - 1]; j++);
cnt1 = min(cnt1, j - i);//找出递增子序列的最小长度,但是会在1234123412这种情况下误判为2而不是4
}
cnt1 *= 2;
for (int i = 0; i < n; i += cnt1) {
if (i + cnt1 > n) { cnt1 = n - i; }
sort(a + i, a + i + cnt1);
}
for (int i = 0; i < n; i++) {
if (i != 0) { cout << ' '; }
cout << a[i];
}
return 0;
}