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 ? ' ' : '\n');
	}
	else cout << "-1\n";
	return 0;

}
posted @ 2017-11-11 13:40  heihuifei  阅读(239)  评论(0编辑  收藏  举报