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. 《吃透MQ系列》核心基础全在这里了

    这是<吃透XXX>技术系列的开篇,这个系列的思路是:先找到每个技术栈最本质的东西,然后以此为出发点,逐渐延伸出其他核心知识.所以,整个系列侧重于思考力的训练,不仅仅是讲清楚 What,而是 ...

  2. 修饰符static和abstract

    修饰符static和abstract static static可以修饰类中的方法,属性等,被修饰后的方法和属性可以通过类名直接调用也可以通过对象调用.普通的变量只能通过对象进行调用. 静态方法直接可 ...

  3. 看了 Spring 官网脚手架真香,也撸一个 SpringBoot DDD 微服务的脚手架!

    作者:小傅哥 博客:https://bugstack.cn 沉淀.分享.成长,让自己和他人都能有所收获! 一.前言 为什么我们要去造轮子? 造轮子的核心目的,是为了解决通用共性问题的凝练和复用. 虽然 ...

  4. 如何在 ASP.Net Web Forms 中使用依赖注入

    依赖注入技术就是将一个对象注入到一个需要它的对象中,同时它也是控制反转的一种实现,显而易见,这样可以实现对象之间的解耦并且更方便测试和维护,依赖注入的原则早已经指出了,应用程序的高层模块不依赖于低层模 ...

  5. upx 手动脱壳

    查壳 UPX 0.89.6 - 1.02 / 1.05 - 2.90 (Delphi) stub -> Markus & Laszlo upx这类压缩壳手动脱壳非常简单. 一.查找oep ...

  6. pwnable.kr第二题collision

    1 col@prowl:~$ ls -al 2 total 36 3 drwxr-x--- 5 root col 4096 Oct 23 2016 . 4 drwxr-xr-x 114 root ro ...

  7. Python基础之异常定义

    技术背景 在各类python的项目中,总会涉及到项目自身相关的一些约束条件.这些约束条件体现在,当用户输入的参数或者文件不符合项目要求时,就拒绝这个参数的输入并且播报出来,提醒用户自行修改,而这一过程 ...

  8. docker部署nodejs项目应用

    之前笔者弄了一套nestjs项目放在自己服务器上,并用pm2管理进程. 现在要把pm2停止,尝试一下用docker容器,那么首先要安装docker 一.安装docker 由于笔者服务器的系统是cent ...

  9. 全网最详细的Linux命令系列-nl命令

    nl命令在linux系统中用来计算文件中行号.nl 可以将输出的文件内容自动的加上行号!其默认的结果与 cat -n 有点不太一样, nl 可以将行号做比较多的显示设计,包括位数与是否自动补齐 0 等 ...

  10. 一文带大家彻底搞懂Hystrix!

    前言? Netflix Hystrix断路器是什么? Netflix Hystrix是SOA/微服务架构中提供服务隔离.熔断.降级机制的工具/框架.Netflix Hystrix是断路器的一种实现,用 ...