According to Wikipedia:

Insertion sort iterates, consuming one input element each repetition, and growing a sorted output list. Each iteration, insertion sort removes one element from the input data, finds the location it belongs within the sorted list, and inserts it there. It repeats until no input elements remain.

Merge sort works as follows: Divide the unsorted list into N sublists, each containing 1 element (a list of 1 element is considered sorted). Then repeatedly merge two adjacent sublists to produce new sorted sublists until there is only 1 sublist remaining.

Now given the initial sequence of integers, together with a sequence which is a result of several iterations of some sorting method, can you tell which sorting method we are using?

Input Specification:

Each input file contains one test case. For each case, the first line gives a positive integer N (≤). Then in the next line, N integers are given as the initial sequence. The last line contains the partially sorted sequence of the N numbers. It is assumed that the target sequence is always ascending. All the numbers in a line are separated by a space.

Output Specification:

For each test case, print in the first line either "Insertion Sort" or "Merge Sort" to indicate the method used to obtain the partial result. Then run this method for one more iteration and output in the second line the resuling sequence. It is guaranteed that the answer is unique for each test case. All the numbers in a line must be separated by a space, and there must be no extra space at the end of the line.

Sample Input 1:

10
3 1 2 8 7 5 9 4 6 0
1 2 3 7 8 5 9 4 6 0
 

Sample Output 1:

Insertion Sort
1 2 3 5 7 8 9 4 6 0
 

Sample Input 2:

10
3 1 2 8 7 5 9 4 0 6
1 3 2 8 5 7 4 9 0 6
 

Sample Output 2:

Merge Sort
1 2 3 8 4 5 7 9 0 6

题意:

给出一个序列的初始状态以及排序过程中的一种状态,判断属于那种排序方式。

思路:

刚开始是根据mooc上面老师讲的思路来做的,先判断是不是插入排序,若不是插入排序,则是归并排序。归并排序本来是想的找出当前归并段的长度(len),下次排序直接将相邻的两个len归并成一个。但是提交的时候发现有测试点过不去。于是就选择了模拟的办法,sort两个归并段。

Code:

#include<iostream>
#include<vector>
#include<algorithm> using namespace std; void Merge(vector<int> &p, vector<int> &t, int l, int r, int Rend) {
int Lend = r - 1;
int prt = l;
while (l <= Lend && r <= Rend) {
if (p[l] < p[r]) t[prt++] = p[l++];
if (p[r] < p[l]) t[prt++] = p[r++];
}
while (l <= Lend) t[prt++] = p[l++];
while (r <= Rend) t[prt++] = p[r++];
int len = 2 * (Rend - Lend);
for (int i = 0; i < len; ++i, Rend--) p[Rend] = t[Rend];
} int main() {
int n;
cin >> n; vector<int> init(n);
vector<int> part(n);
vector<int> temp(n); int t, p, q;
for (int i = 0; i < n; ++i) {
cin >> t;
init[i] = t;
}
for (int i = 0; i < n; ++i) {
cin >> t;
part[i] = t;
}
p = 1;
while (p < n && part[p] > part[p-1]) ++p;
p++;
q = p;
while (q < n && part[q] == init[q]) ++q; if (q == n) {
cout << "Insertion Sort" << endl;
sort(part.begin(), part.begin()+p);
cout << part[0];
for (int i = 1; i < n; ++i) cout << " " << part[i];
} else {
cout << "Merge Sort" << endl;
int j, k;
bool flag = false;
for (j = 1; j < n; j *= 2) {
k = j - 1;
while (k + 1 < n) {
if (part[k] < part[k+1]) k += 2 * j;
else { flag = true; break; }
}
if (flag) break;
}
for (k = 0; k <= n-2*j; k += 2*j) {
Merge(part, temp, k, k+j, k+2*j-1);
}
if (k + j < n)
Merge(part, temp, k, k+j, n); cout << part[0];
for (int i = 1; i < n; ++i) cout << " " << part[i];
} cout << endl; return 0;
}

  

骗了15分。


#include<iostream>
#include<vector>
#include<algorithm> using namespace std; int main() {
int n;
cin >> n; vector<int> init(n);
vector<int> part(n);
vector<int> temp(n); int t, p, q;
for (int i = 0; i < n; ++i) {
cin >> t;
init[i] = t;
}
for (int i = 0; i < n; ++i) {
cin >> t;
part[i] = t;
}
for (p = 0; p < n-1 && part[p] <= part[p+1]; p++);
for (q = p+1; init[q] == part[q] && q < n; q++);
if (q == n) {
cout << "Insertion Sort" << endl;
sort(part.begin(), part.begin()+p+2);
cout << part[0];
for (int i = 1; i < n; ++i) cout << " " << part[i];
} else {
cout << "Merge Sort" << endl;
int j, k = 1;
bool flag = true;
while (flag) {
flag = false;
for (int i = 0; i < n; ++i) {
if (init[i] != part[i])
flag = true;
}
k *= 2;
for (j = 0; j < n/k; ++j)
sort(init.begin()+j*k, init.begin()+(j+1)*k);
sort(init.begin()+(n/k)*k, init.end());
}
cout << init[0];
for (int i = 1; i < n; ++i)
cout << " " << init[i];
} cout << endl; return 0;
}

  

参考:

https://www.liuchuo.net/archives/1902

1089 Insert or Merge的更多相关文章

  1. PAT甲级1089. Insert or Merge

    PAT甲级1089. Insert or Merge 题意: 根据维基百科: 插入排序迭代,消耗一个输入元素每次重复,并增加排序的输出列表.每次迭代,插入排序从输入数据中删除一个元素,在排序列表中找到 ...

  2. PAT 1089 Insert or Merge[难]

    1089 Insert or Merge (25 分) According to Wikipedia: Insertion sort iterates, consuming one input ele ...

  3. PAT甲级:1089 Insert or Merge (25分)

    PAT甲级:1089 Insert or Merge (25分) 题干 According to Wikipedia: Insertion sort iterates, consuming one i ...

  4. 1089 Insert or Merge(25 分)

    According to Wikipedia: Insertion sort iterates, consuming one input element each repetition, and gr ...

  5. PAT 1089. Insert or Merge (25)

    According to Wikipedia: Insertion sort iterates, consuming one input element each repetition, and gr ...

  6. 1089. Insert or Merge (25)

    题目如下: According to Wikipedia: Insertion sort iterates, consuming one input element each repetition, ...

  7. 1089. Insert or Merge (25)-判断插入排序还是归并排序

    判断插入排序很好判断,不是的话那就是归并排序了. 由于归并排序区间是2.4.8开始递增的,所以要判断给出的归并排序执行到哪一步,就要k从2开始枚举. 然后再对每个子区间进行一下sort即可. #inc ...

  8. PAT (Advanced Level) 1089. Insert or Merge (25)

    简单题.模拟一下即可. #include<cstdio> #include<cstring> #include<cmath> #include<vector& ...

  9. PAT 1089. Insert or Merge

    Insertion sort iterates, consuming one input element each repetition, and growing a sorted output li ...

  10. 1089 Insert or Merge (25 分)

    According to Wikipedia: Insertion sort iterates, consuming one input element each repetition, and gr ...

随机推荐

  1. c++指针数组与二维数组的最大区别

    下面随笔是关于指针数组说明及与二维数组的最大区别. 指针数组 数组的元素是指针型 例 利用指针数组存放矩阵 1 #include 2 using namespace std; 3 int main() ...

  2. Spring Boot 2.x基础教程:使用MongoDB

    前段时间因为团队调整,大部分时间放在了团队上,这系列的更新又耽误了一下.但既然承诺持久更新,那就不会落下,今天开始继续更新这部分的内容! 过了年,重申一下这个系列的目标:目前主要任务就是把Spring ...

  3. kubernetes cpu限制参数说明

    docker CPU限制参数 Option Description --cpus=<value> Specify how much of the available CPU resourc ...

  4. HDOJ-2087(KMP算法)

    剪花布条 HDOJ-2087 本题和hdoj-1686相似,唯一不同的是这里的子串一定要是单独的.所以在确定有多少个子串时不能用前面的方法.而是在循环时,只要找到一个子串,i就不是++,而是+=子串的 ...

  5. Mybatis系列全解(二):Mybatis简介与环境搭建

    封面:洛小汐 作者:潘潘 Mybatis 是一套持久层框架,灵活易用,特别流行. 前言 Mybatis系列全解,我们预计准备10+篇文章,让我们了解到 Mybatis 的基本全貌,真正从入门到上手,从 ...

  6. windows跳转端口

    //将客户机端口内网33306转发到外网,在通过本地连接ssh -L 3306:10.0.0.208:3306 ttx@180.180.180.182--通过git bash执行命令--10.0.0. ...

  7. C# 基础 - linq 举例应用

    public class Player { public string Id { get; set; } public string Name { get; set; } public int Age ...

  8. idea添加本地文件约束(DTD)

    当我们做 xml 文件配置的时候,需要对其进行约束的配置 例如: hibernate 如果我们在联网的情况下是可以不添加配置文件约束的,红框内的 URL 会自动帮我们从网络上加载约束文件,但是没有网络 ...

  9. 循环单链表定义初始化及创建(C语言)

    #include <stdio.h> #include <stdlib.h> /** * 含头节点循环单链表定义,初始化 及创建 */ #define OK 1; #defin ...

  10. Java 树结构实际应用 三(二叉排序树)

    二叉排序树 1 先看一个需求 给你一个数列 (7, 3, 10, 12, 5, 1, 9),要求能够高效的完成对数据的查询和添加   2 解决方案分析  使用数组 数组未排序, 优点:直接在数组尾添 ...