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;
}