当前位置:首页 > 题解目录 > 正文内容

【题解】合并有序表

亿万年的星光7个月前 (06-20)题解目录560

【题目描述】

k路归并问题
把k个有序表合并成一个有序表。
元素共有n个。

【输入描述】

读入K。接下来K行。每i行第一个数为Ci表示接下来这一行有Ci个数,表示第i个序列。
总数小于100000。

【输出描述】

输出有序序列

【样例输入】

6
3 1 2 3
3 4 5 6
3 7 10 13
3 8 11 14
3 9 12 15
3 0 16 17

【样例输出】

0
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17

【题目分析】



核心方法


  1. 把所有数字全部存到一个大数组里(不管顺序)。

  2. 直接对整个大数组排序(sort)。

  3. 输出排序后的结果。


为什么可以这样做?


  • 题目已经告诉我们 每个子数组都是有序的,但 合并后的数组不一定有序。

  • 直接 全部存到一个数组里再排序,是最简单的方法(但效率不是最高)。



例子:

3
3 1 5 9
2 2 6
4 3 4 7 8



执行过程

  1. 读取输入

    • K=3(3 个子数组)。

    • 第1个子数组:[1, 5, 9](长度 3)。

    • 第2个子数组:[2, 6](长度 2)。

    • 第3个子数组:[3, 4, 7, 8](长度 4)。

  2. 合并到 result

    • result = [1, 5, 9, 2, 6, 3, 4, 7, 8](共 9 个数字)。

  3. 排序 result

    • std::sort → [1, 2, 3, 4, 5, 6, 7, 8, 9]

  4. 输出

    • 1 2 3 4 5 6 7 8 9




【参考答案】


#include <iostream>
#include <algorithm>
using namespace std;
int lists[100][100];//存储所有子数组
int sizes[1000]; //每个子数组的长度(大小) 
int result[1000]; //存放最终合并后的数组
int total_size; //合并后数组总长度 
void mergeKSortedLists(int K) {
    total_size = 0; 
    // 将所有子序列的元素存入 result
    for (int i = 0; i < K; i++) {
        for (int j = 0; j < sizes[i]; j++) {
            result[total_size++] = lists[i][j];  //把 lists[i][j] 的值存入 result,并让 total_size 指向下一个位置。
        }
    }
    // 直接排序
    sort(result, result + total_size);
}

int main() {
    int K;
    cin >> K;

    // 读取输入
    for (int i = 0; i < K; i++) {
        cin >> sizes[i];
        for (int j = 0; j < sizes[i]; j++) {
            cin >> lists[i][j];
        }
    }
	//调用函数 
    mergeKSortedLists(K);
    // 输出结果
    for (int i = 0; i < total_size; i++) {
        cout << result[i] << " ";
    }
    cout << endl;
    return 0;
}


注:很难拿到满分










【思路二】:直接使用优先队列

#include <iostream>
#include <queue>
using namespace std;
int main()
{
	priority_queue<int,vector<int>,greater<int> >q;
	int n,x,y,i,j;
	cin>>n;
	for(i=1;i<=n;i++)
	{
		cin>>x;
		for(j=1;j<=x;j++)
		{
			cin>>y;
			q.push(y);
		}
	}
	while(!q.empty()) 
	{
		cout<<q.top()<<endl;
		q.pop();
	}
	return 0;
}



扫描二维码推送至手机访问。

版权声明:本文由青少年编程知识记录发布,如需转载请注明出处。

分享给朋友:

相关文章

【题解】变换数组

【题目描述】输入一个数组 a,包含有 n 个元素 a1,a2,⋯,an。对这个数组进行 m 次变换,每次变换会将数组 a ...

【题解】01背包

【题目描述】一个旅行者有一个最多能装 M 公斤的背包,现在有 n 件物品,它们的重量分别是W1,W2,...,Wn,它们的价值分别为C1,C2,...,Cn,求旅行者能获得最大总价值。【输入描述】第一...

【题解】母舰

【题目描述】在小A的星际大战游戏中,一艘强力的母舰往往决定了一场战争的胜负。一艘母舰的攻击力是普通的MA(Mobile  Armor)无法比较的。 对于一艘母舰而言,它是由若干个攻击系统和若...

【题解】区间数位个数

2.区间数位个数(digit.cpp)【描述】给定整数n和整数k,求出1~n中所有数的每一位数字中,出现数字k的次数。【输入】第一行是两个个整数n和k【输出】一个整数表示答案。【样例输入输出】ligh...

【题解】切割绳子

【题目描述】有N条绳子,它们的长度分别为Li。如果从它们中切割出K条长度相同的绳子,这K条绳子每条最长能有多长?答案保留到小数点后2位(直接舍掉2位后的小数)。【输入描述】第一行两个整数N和K(0&l...

2021年市北区程序设计竞赛题(⼩学组)

最⼤值的相乘(maxx.cpp)【问题描述】第⼀⾏有x个正整数a1,a2,..,ax,第⼆⾏有y个正整数b1,b2,...,by,第三⾏有z个正整数c1,c2,...,cz,假设第⼀⾏的x个正整数中的...