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

【题解】合并有序表

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

【题目描述】

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



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

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

分享给朋友:

相关文章

整理药名

【题目描述】医生在书写药品名的时候经常不注意大小写,格式比较混乱。现要求你写一个程序将医生书写混乱的药品名整理成统一规范的格式,即药品名的第一个字符如果是字母要大写,其他字母小写。如将ASPIRIN、...

【题解】Ride to Office

【题目描述】起点与终点相隔4500米。现Charley 需要从起点骑车到终点。但是,他有个习惯,沿途需要有人陪伴,即以相同的速度, 与另外一个人一起骑。而当他遇到以更快的速度骑车的人时,他会以相应的速...

猴子吃桃

【题目描述】猴子吃桃问题。猴子第一天摘下若干个桃子,当即吃了一半,还不过瘾,又多吃了一个。 第二天早上又将剩下的桃子吃掉一半,又多吃一个。以后每天早上都吃了前一天剩下的一半零一个。到第N天早上想再吃时...

【题解】采摘花生2

【题目描述】Hello Kitty又一次来到花生地里摘花生,从左上角进入花生地,从右下角出去,只能向右或者向下,请问Hello Kitty应该沿着什么样的路线走,能够摘到的花生数量最多(假设花生地里没...

【题解】游戏

【题目描述】上了半天的物理数学课,大家的脑子有点转不动了,下午的课表似乎看透了同学们的 心思,第一节就安排了体育课,CZ 中学的课表真是太有爱了,赞一个!午间休息后,文体 委员小 S 喊大家到教室外的...

【题解】网线主管

【题目描述】仙境的居民们决定举办一场程序设计区域赛。裁判委员会完全由自愿组成,他们承诺要组织一次史上最公正的比赛。他们决定将选手的电脑用星形拓扑结构连接在一起,即将它们全部连到一个单一的中心服务器。为...