• just_sort


    ★实验任务

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

    解题思路:直接对输入的a数组中的0的位置存储,然后b数组中先排序一次,计入位置之后进行比对就行了;我这题SO的超级委屈,因为我直接把几个10万级的数组放在了main函数里头,放在栽面就过了。

    代码:

    #include<iostream>
    #include<cstdio>
    #include<cstdlib>
    #include<algorithm>
    #include<cmath>
    int num[100005], Zero[100005];
    int temp[100005] = { 0 };
    using namespace std;
    int main()
    {
    	int i = 0, j = 0, k = 0;
    	
    	int n, m, tmp, ok = 0;
    	cin >> n >> m;
    	for (i = 0; i < n; i++)
    	{
    		cin >> tmp;
    		if (tmp == 0)Zero[j++] = i;
    		else num[k++] = tmp;
    	}
    	for (i = 0; i < m; i++)
    	{
    		cin >> tmp; temp[tmp]++;
    		num[k++] = tmp;
    	}
    	sort(num, num + n);
    	for (i = 0; i < j; i++)
    	{
    		if (temp[num[Zero[i]]] == 1) { temp[num[Zero[i]]]--; ok = 1; }
    		else { ok = 0; break; }
    	}
    	if (ok == 1)
    	{
    		for (i = 0; i < n; i++)printf("%d%c", num[i], i != n - 1 ? ' ' : '
    ');
    	}
    	else cout << "-1
    ";
    	return 0;
    
    }
    
  • 相关阅读:
    c 语言学习第一天
    react+antd 使用脚手架动态修改主题色
    用 vitePress 快速创建一个文档项目
    react懒加载,减少首屏加载时间
    react-devtools安装以及使用中的问题
    react为什么不用数组的下标来绑定key
    三种js缓存(笔记)
    关于浏览器自动记住登录帐号和密码后, 一些输入框会显示帐号密码信息
    H5 Hybrid开发-前端资源本地化方案纪要
    webpack + ts 配置路径别名无死角方法总结
  • 原文地址:https://www.cnblogs.com/heihuifei/p/7818844.html
Copyright © 2020-2023  润新知