★实验任务

给定两个序列 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. js滚动监听

    下边代码,是监听滚动条只要移动,下方的返回顶部的div显示与隐藏的代码 ? 1 2 3 4 5 6 7 8 window.onscroll = function () {  var t = docum ...

  2. linux 特殊命令(二)

    Netstat 命令用于显示各种网络相关信息,如网络连接,路由表,接口状态 (Interface Statistics),masquerade 连接,多播成员 (Multicast Membershi ...

  3. vmware 虚拟机设置 redhat 桥接模式

    1.设置 vmware 网络模式 2.设置 linux 网络模式

  4. PyPI - Datetime

    PyPI for Python 3.7 import datetime https://docs.python.org/3.7/library/datetime.html timedelta Obje ...

  5. 组播___IGMP

    一.基本概念: 1.协议概述: 是运行在主机和与主机直连的路由器之间,其实现的功能是双向的:一方面,主机通过IGMP通知路由器希望接收某个特定组播组的信息:另一方面,路由器通过IGMP周期性地查询局域 ...

  6. c语言中:strlen和sizeof的区别和它们分别交换各自作用领域(\0问题)时的细微差别!!!

    本人c语言初学菜鸟一枚,今天通过敲了一段简单代码,发现strlen和sizeof之间的一些关系,总结如下: 用strlen计算数组长度要考虑进去\0 用sizeof计算字符串长度也要考虑进去\0 而s ...

  7. go学习笔记-并发

    并发 goroutine goroutine是Go并行设计的核心.goroutine说到底其实就是协程,但是它比线程更小,十几个goroutine可能体现在底层就是五六个线程,Go语言内部帮你实现了这 ...

  8. Go语言中的运算符

    ## 1 概述Go语言提供了,算术,关系,逻辑,位,指针,赋值运算符.本篇整体说明一下. ## 2 算术运算 * \+ 相加* \- 相减* \* 相乘* / 相除* % 求余* ++ 自增* \-\ ...

  9. 树形DP(例题)

    没有上司的舞会 题目 Ural大学有N个职员,编号为1~N.他们有从属关系,也就是说他们的关系就像一棵以校长为根的树,父结点就是子结点的直接上司.每个职员有一个快乐指数.现在有个周年庆宴会,要求与会职 ...

  10. 【转】Odoo开发之:工作流 workflow

    在OpenERP中,工作流是管理一组“所做的事情”(与一些数据模型的记录关联)的人为现象.工作流提供了高级别的方式来组织记录要上做的事情. 具体地说,工作流是一个定向的路径,这里节点称为活动并且弧线称 ...