★实验任务

给定两个序列 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

思路

将第一次输入的序列中的非零数取出来存入数组b,并将位置标记为-1,将取出的数组b和后输入的序列排序后,按照标记(0和-1)填入数组,判断是否递增即可。



但是这道题我得到了十个SO,原因是在main函数里开了3个100000的数组导致。

Code

#include<stdio.h>
#include<time.h>
#include<stdlib.h>
#include<iostream>
#include<string.h>
using namespace std;
int partition(int *arr,int l,int r);
void swap(int &x,int &y)
{
int temp;
temp=x;
x=y;
y=temp;
}
void quicksort(int *arr,int l,int r)
{
int i;
if(l>=r)return;
i=partition(arr,l,r); //找到中间数
// cout<<i<<endl;
quicksort(arr,l,i-1); //对左半边排序
quicksort(arr,i+1,r); //对右半边排序
}
int partition(int *arr,int l,int r)
{
int v=l;
int x=arr[v];
int i=l;
int j=r+1;
while(1)
{
while(i+1<=r)
{
if(arr[i+1]<x)
{
i++;
}
else
{
i++;
break;
}
}
while(j-1>=l)
{
if(arr[j-1]>x)
{
j--;
}
else
{
j--;
break;
}
}
if(i>=j)break;
swap(arr[i],arr[j]);
}
swap(arr[v],arr[j]);
return j;
}
int main()
{
int a[100001],b[100001],c[100001];
int m,n,i,j,flag=0;
scanf("%d %d",&m,&n);
for(i=0,j=0;i<m;i++)
{
scanf("%d",&a[i]);
if(a[i]!=0)
{
b[j++]=a[i];
a[i]=-1;
}
}
// for(i=0;i<m;i++)
// printf("%d",a[i]);
// printf("\n");
// for(i=0;i<j;i++)
// printf("%d",b[i]);
// printf("\n");
for(i=0;i<n;i++)
scanf("%d",&c[i]);
quicksort(b,0,j-1);
quicksort(c,0,n-1);
// for(i=0;i<j;i++)
// printf("%d ",b[i]);
// printf("\n");
// for(i=0;i<n;i++)
// printf("%d ",c[i]);
// printf("\n");
int x=0,y=0;
for(i=0;i<m;i++)
{
if(a[i]==0)
{
a[i]=c[x++];
}
else
{
a[i]=b[y++];
}
}
// for(i=0;i<m;i++)
// printf("%d ",a[i]);
// printf("\n");
for(i=0;i<m-1;i++)
{
if(a[i]>a[i+1])
{
flag=1;
break;
}
}
if(flag)
{
printf("-1");
}
else
{
for(i=0;i<m;i++)
printf("%d ",a[i]);
}
return 0;
}

算法与数据结构5.1 Just Sort的更多相关文章

  1. 算法与数据结构5.2 Bubble Sort

    ★实验任务 给定一个 1~N 的排列 P,即 1 到 N 中的每个数在 P 都只出现一次. 现在要 对排列 P 进行冒泡排序,代码如下: for (int i = 1; i <= N; ++i) ...

  2. JS中的算法与数据结构——排序(Sort)(转)

    排序算法(Sort) 引言 我们平时对计算机中存储的数据执行的两种最常见的操作就是排序和查找,对于计算机的排序和查找的研究,自计算机诞生以来就没有停止过.如今又是大数据,云计算的时代,对数据的排序和查 ...

  3. JS中的算法与数据结构——排序(Sort)

    排序算法(Sort) 引言 我们平时对计算机中存储的数据执行的两种最常见的操作就是排序和查找,对于计算机的排序和查找的研究,自计算机诞生以来就没有停止过.如今又是大数据,云计算的时代,对数据的排序和查 ...

  4. LeetCode_算法及数据结构覆盖统计

    [输入]共计151道题的算法&数据结构基础数据 (见附录A) [输出-算法]其中有算法记录的共计 97道 ,统计后 结果如下  top3(递归,动态规划,回溯) 递归 动态规划 回溯 BFS ...

  5. 【算法与数据结构实战】线性表操作-实现A并B,结果放入A中

    //数据结构与算法基础题1:线性表操作,实现A并B,结果放入A中 #include "stdafx.h" #include <iostream> #include &l ...

  6. [Oracle] 关系型数据库排序算法和数据结构以及关联查询

    关系型数据库排序算法和数据结构以及关联查询 1. Merge sort 理解merge sort算法将有助于更好地理解数据库join操作 - merge join 算法逻辑 将2个有序的大小为N/2的 ...

  7. 算法与数据结构基础 - 堆(Heap)和优先级队列(Priority queue)

    堆基础 堆(Heap)是具有这样性质的数据结构:1/完全二叉树 2/所有节点的值大于等于(或小于等于)子节点的值: 图片来源:这里 堆可以用数组存储,插入.删除会触发节点shift_down.shif ...

  8. 算法与数据结构基础 - 广度优先搜索(BFS)

    BFS基础 广度优先搜索(Breadth First Search)用于按离始节点距离.由近到远渐次访问图的节点,可视化BFS 通常使用队列(queue)结构模拟BFS过程,关于queue见:算法与数 ...

  9. 算法与数据结构基础 - 哈希表(Hash Table)

    Hash Table基础 哈希表(Hash Table)是常用的数据结构,其运用哈希函数(hash function)实现映射,内部使用开放定址.拉链法等方式解决哈希冲突,使得读写时间复杂度平均为O( ...

随机推荐

  1. Asp.Net Core使用Log4Net优化日志【项目开源】

    我在前一篇文章中介绍了一种使用Log4Net的方法,但是那种方法打出来的日志不是很直观 然后我前不久阅读了一篇非常不错的博客:https://www.cnblogs.com/guolianyu/p/9 ...

  2. Bigdata--hadoop系列安装

    Date:20180827 Monday 目前市场hadoop主流版本是2.7.x系列,下面我们就以hadoop-2.7.3为例进行安装 安装前准备: 1.操作系统:cetos(6和7) 2.java ...

  3. MFC非模态添加进程控件方法一(线程方法)

    由于非模态对话框的自己没有消息循环,创建后无法进行消息处理.需要和父窗口共用消息循环.如果单独在子窗口进行控件由于自己没有单独的消息循环,更新是无法进行的. 如果在父窗口更新控件会造成程序假死.如以下 ...

  4. fake_useragent 封装好user-agent的模块

    from fake_useragent import UserAgent useragent = UserAgent()print(useragent.random)

  5. linux驱动动态与静态加载

    在Linux中驱动的加载方式有动态加载和静态加载.动态加载,即驱动不添加到内核中,在内核启动完成后,仅在用到这一驱动时才会进行加载静态加载,驱动编译进内核中,随内核的启动而完成驱动的加载.添加字符驱动 ...

  6. go内建容器-切片

    1.基础定义 看到'切片'二字,满脸懵逼.切的啥?用的什么刀法切?得到的切片有什么特点?可以对切片进行什么操作? 先看怎么得到切片,也就是前两个问题.切片的底层是数组,所以切片切的是数组:切的时候采用 ...

  7. 天津Uber优步司机奖励政策(1月4日~1月10日)

    滴快车单单2.5倍,注册地址:http://www.udache.com/ 如何注册Uber司机(全国版最新最详细注册流程)/月入2万/不用抢单:http://www.cnblogs.com/mfry ...

  8. Unicode编码相关概念

    1.Unicode是一种字符映射方案,这种映射并不是编码(即还没有到二进制机器码层面),而是像一个电话本一样,把全世界所有语言使用的字符,都映射成一个"u+"开头的数字(在JAVA ...

  9. netty之粘包分包的处理

    1.netty在进行字节数组传输的时候,会出现粘包和分包的情况.当个数据还好,如果数据量很大.并且不间断的发送给服务器,这个时候就会出现粘包和分包的情况. 2.简单来说:channelBuffer在接 ...

  10. docker in docker

    docker run --rm可以从一个镜像启动容器,并在容器执行完成后自动删除,这在计算任务中非常有用. 例如,我们通过以下步骤完成计算任务容器的启动: 1 将输入数据通过卷挂载方式连接到计算任务容 ...