问题描述

给定两个序列 a b,序列 a 原先是一个单调递增的正数序列,但是由于某些
原因,使得序列乱序了,并且一些数丢失了(用 0 表示)。经过数据恢复后,找
到了正数序列 b ,且序列 a 中 0 的个数等于序列 b 的个数,打算使用序列 b 恢
复序列 a 。
对于序列 a 来说,我们可以交换两个位置上的非零的数,并且可以交换任意
次。序列 b 同样也可以进行任意次交换。
现在要将序列 b 填充到序列 a 中的值丢失的位置上,序列 b 中的每个数只能
填充一次,问最后构成的序列是否是单调递增的,如果是,则输出填充后的序列,
否则输出-1。

★数据输入
输入给定 N M, 表示序列 a 和序列 b 的长度。 第一行为序列 a ,第二行为
序列 b。 题目保证除了 0 以外的数,在序列 a 和 b 中只出现一次。
数据保证:
80%的数据, N, M <= 100
100%的数据, N, M <= 100000, 0 <= a[i] <= 100000, 0 < b[i] <= 100000

★数据输出
如果最后序列 a 是单调递增的,输出该序列,否则输出-1。

输入示例 输出示例
4 2
0 11 0 15
1 12
1 11 12 15
输入示例 输出示例
4 2
0 0 11 15
1 12
-1

思路:

  用三个数组:

    用 a0[ ] 存输入的序列a

    用 a[ ] 存序列a中不带0的元素

    用b[ ] 存序列b

  用归并对 a[ ] 与b[ ]排序 (由于数据<=100000的原因,用计数排序会更快O(n) ;不用快排是最坏会O(n^2),怕OJ故意出比较坑的数据)

  将a[ ] 与b[ ]插入a0[ ] ,检测是否可行

code

 #include <stdio.h>
#include <stdlib.h> int buf[]={}; inline int max(int a,int b)
{
return a>b?a:b;
} void mergesort(int *p,int l,int r)
{
if(l>=r) return;
if(l+==r)
{
if(p[l]>p[r])
{
p[l]^=p[r];
p[r]^=p[l];
p[l]^=p[r];
}
return;
}
int i,j,k;
int m = (l+r)/;
mergesort(p,l,m);
mergesort(p,m+,r);
for(i=l; i<=r; i++) buf[i]=p[i];
for(k=l,i=l,j=m+; k<=r; k++)
{
if(i>m) p[k]=buf[j++];
else if(j>r) p[k]=buf[i++];
else if(buf[i]<buf[j]) p[k]=buf[i++];
else p[k]=buf[j++];
}
} int main()
{
int i,j,k;
int a_len=;
int a0_len,b_len,tmp;
scanf("%d %d",&a0_len,&b_len);
int *a0 = (int *)malloc(sizeof(int)*a0_len);
int *a = (int *)malloc(sizeof(int)*a0_len);
int *b = (int *)malloc(sizeof(int)*b_len);
//--------------------------------------------------------
for(i=; i<a0_len; i++)
{
scanf("%d",a0+i);
if(a0[i]!=)
{
a[a_len++]=a0[i];
}
}
for(i=; i<b_len; i++)
{
scanf("%d",b+i);
}
mergesort(a,,a_len-);
mergesort(b,,b_len-); bool flag = true;
for(i=,j=,k=; k<a0_len; k++)
{
if(a0[k]==)
{
a0[k]=b[j++];
}
else
{
a0[k]=a[i++];
}
if(k!= && a0[k]<a0[k-])
{
flag = false;
break;
}
} if(flag)
{
for(i=;i<a0_len;i++)
{
printf("%d ",a0[i]);
}
}
else
{
printf("-1");
}
printf("\n");
//--------------------------------------------------------
free(a);
free(b);
free(a0);
return ;
}

数据结构_just_sort的更多相关文章

  1. 多线程爬坑之路-学习多线程需要来了解哪些东西?(concurrent并发包的数据结构和线程池,Locks锁,Atomic原子类)

    前言:刚学习了一段机器学习,最近需要重构一个java项目,又赶过来看java.大多是线程代码,没办法,那时候总觉得多线程是个很难的部分很少用到,所以一直没下决定去啃,那些年留下的坑,总是得自己跳进去填 ...

  2. 一起学 Java(三) 集合框架、数据结构、泛型

    一.Java 集合框架 集合框架是一个用来代表和操纵集合的统一架构.所有的集合框架都包含如下内容: 接口:是代表集合的抽象数据类型.接口允许集合独立操纵其代表的细节.在面向对象的语言,接口通常形成一个 ...

  3. 深入浅出Redis-redis底层数据结构(上)

    1.概述 相信使用过Redis 的各位同学都很清楚,Redis 是一个基于键值对(key-value)的分布式存储系统,与Memcached类似,却优于Memcached的一个高性能的key-valu ...

  4. 算法与数据结构(十五) 归并排序(Swift 3.0版)

    上篇博客我们主要聊了堆排序的相关内容,本篇博客,我们就来聊一下归并排序的相关内容.归并排序主要用了分治法的思想,在归并排序中,将我们需要排序的数组进行拆分,将其拆分的足够小.当拆分的数组中只有一个元素 ...

  5. 算法与数据结构(十三) 冒泡排序、插入排序、希尔排序、选择排序(Swift3.0版)

    本篇博客中的代码实现依然采用Swift3.0来实现.在前几篇博客连续的介绍了关于查找的相关内容, 大约包括线性数据结构的顺序查找.折半查找.插值查找.Fibonacci查找,还包括数结构的二叉排序树以 ...

  6. 算法与数据结构(九) 查找表的顺序查找、折半查找、插值查找以及Fibonacci查找

    今天这篇博客就聊聊几种常见的查找算法,当然本篇博客只是涉及了部分查找算法,接下来的几篇博客中都将会介绍关于查找的相关内容.本篇博客主要介绍查找表的顺序查找.折半查找.插值查找以及Fibonacci查找 ...

  7. 算法与数据结构(八) AOV网的关键路径

    上篇博客我们介绍了AOV网的拓扑序列,请参考<数据结构(七) AOV网的拓扑排序(Swift面向对象版)>.拓扑序列中包括项目的每个结点,沿着拓扑序列将项目进行下去是肯定可以将项目完成的, ...

  8. 算法与数据结构(七) AOV网的拓扑排序

    今天博客的内容依然与图有关,今天博客的主题是关于拓扑排序的.拓扑排序是基于AOV网的,关于AOV网的概念,我想引用下方这句话来介绍: AOV网:在现代化管理中,人们常用有向图来描述和分析一项工程的计划 ...

  9. 掌握javascript中的最基础数据结构-----数组

    这是一篇<数据结构与算法javascript描述>的读书笔记.主要梳理了关于数组的知识.部分内容及源码来自原作. 书中第一章介绍了如何配置javascript运行环境:javascript ...

随机推荐

  1. poj1325

    给出一系列任务,每个任务可以在机器A的某个模式,或者在机器B的某个模式下完成.机器A和B每切换一次模式需要重启一次.问完成这些任务,最少需要重启机器多少次? 把任务看作边 “重启”操作看作点 这道题就 ...

  2. LeetCode Predict the Winner

    原题链接在这里:https://leetcode.com/problems/predict-the-winner/description/ 题目: Given an array of scores t ...

  3. [ Laravel 5.5 文档 ] 数据库操作 —— 在 Laravel 中轻松实现分页功能

     简介 在其他框架中,分页是件非常痛苦的事,Laravel 让这件事变得简单易于上手.Laravel 的分页器与查询构建器和 Eloquent ORM 集成在一起,并开箱提供方便的.易于使用的.基于 ...

  4. Operating System-进程/线程内部通信-信号量和PV操作

    本文介绍操作系统进程管理的两个核心概念: 信号量 PV操作 一.信号量介绍 1.1 信号量引入 信号量(Semaphore)1965年由Dijkstra引入的.信号量一般由一个值是一个变量,其值有可能 ...

  5. markdown的学习

    开始 语法 编辑器 sublime配置 图床 体验 开始 昨天晚上加上今天上午,折腾了算是一天的markdown编辑器. 原因是,为了写博客.在博客园写的东西,想法不到简书里,结果发现有部分乱码,以及 ...

  6. Poj 3253 Fence Repair(哈夫曼树)

    Description Farmer John wants to repair a small length of the fence around the pasture. He measures ...

  7. 把python2.6升级到python2.7(同样适用于把python2升级到python3)

    在启用https过程中,在生成CSR(证书请求文件)时,报错了,说python2.6已被python团队抛弃了,所以升级python到2.7 话不多说,直接上代码: 步骤1:下载python2.7.1 ...

  8. [转载]Linux C 字符串函数 sprintf()、snprintf() 详解

    一.sprintf() 函数详解 在将各种类 型的数据构造成字符串时,sprintf 的强大功能很少会让你失望. 由于 sprintf 跟 printf 在用法上几乎一样,只是打印的目的地不同而已,前 ...

  9. 本地dns服务器到底是什么?有没有精确的概念?

    1.本地dns到底是什么?为什么有时候看到的本地dns的ip是局域网类型的ip? 有的人说本地dns的概念——————是运营商提供的dns, 有的人也说,是你的局域网里的路由器一类的设备里的dns. ...

  10. c语言-单链表(二)

    继续复习链表知识点,本章包含单链表的增加,删除,判断是否为空,和链表长度,以及链表的排序 几个知识点 1.链表的判断是否为空 //1.判断链表是否为空 bool isempty_list(PNODE ...