【特别注意】:这个方法有问题,正确的方法是用堆实现,最近比较忙,没时间写代码,过一段时间补上。/**
* 两个数组a1和a2,大小都为k。
* 有两个序列A和B,A=(a1,a2,...,ak),B=(b1,b2,...,bk),A和B都按升序排列,
* 对于1<=i,j<=k,求k个最小的(ai+bj),要求算法尽量高效。
*/
#include <stdio.h>
#define M 6
#define N 8
int a1[M] = {1,3,5,6,9,10};
int a2[M] = {2,2,3,3,5,11};
int x = 0;
int y = 0;
int result[N] = {0};
int min(int a, int b){
return a<b?a:b;
}
int main(){
int i = 0;
int h = 1;
int index = 0;
int max_index = 5;
result[index++] = a1[x]+a2[y];
while(1){
//固定x,y先前走,直到和大于a[x+1][y]
h = 1;
while(a1[x] + a2[y+h] <= a1[x+1] + a2[y]){
result[index++] = a1[x] + a2[y+h];
if(index == max_index) break;
h++;
}
result[index++] = a1[x+1] + a2[y];
if(index == max_index) break;
x++;
//固定y,x先前走,直到和大于a[x][y+1]
h = 1;
while(a1[x+h] + a2[y] <= a1[x] + a2[y+1]){
result[index++] = a1[x+h] + a2[y];
if(index == max_index) break;
h++;
}
result[index++] = a1[x] + a2[y+1];
if(index == max_index) break;
y++;
}
printf("结果是:\n");
for(i=0;i<5;i++)
printf("%d ",result[i]);
return 0;
}
运行结果:
分享到:
相关推荐
- Container With Most Water: 给定一个数组,其中每个元素代表一个宽度为1的柱子高度,要求找出两个柱子,使得它们之间能盛最多量的水。 - Integer to Roman / Roman to Integer: 这两个问题分别要求将整数转换为...
- **问题描述**:给定一个整数数组 nums 和一个目标值 target,请你在该数组中找出和为目标值的那两个整数,并返回他们的数组下标。 - **解题思路**: - 使用哈希表,对于每个元素 x,查找哈希表中是否存在 target ...
我们要找出一对目标位置,使得从一个目标移动到另一个目标的路径上的所有距离之和最小。 **动态规划解决方案:** 动态规划是一种将复杂问题分解为更小子问题的方法。在这个问题中,我们可以创建一个二维数组dp,...
最小公倍数(LCM)是两个或多个整数共有的倍数中最小的一个。常用的算法有辗转相除法和更相减损法。 **9. 组合序列** 组合序列是指从n个不同元素中取出k个元素的组合方式的数量。可以通过组合数公式C(n,k) = n! / ...
- **选择排序**:通过比较找到数组中最小(或最大)的元素,与第一个位置交换,然后在剩余元素中重复此过程。代码中使用了两个嵌套`for`循环,外层循环遍历数组元素,内层循环找到当前未排序部分的最小值并交换。 ...
- 稳定婚姻问题是指给定两组人(如男性和女性),每个人都对对方有一套偏好顺序,如何配对才能使得没有一对人会愿意离开自己的伴侣去和另一个人在一起。 - **拓扑排序** - 拓扑排序是对有向无环图(DAG)的一种...
- 输出频率最高的k个单词:使用优先队列(堆)维护单词及其频率,每次取出频率最高的一个,直到k个。 这些题目要求学生掌握基本的编程技巧和数据结构操作,同时考察了问题解决能力和算法设计能力。通过解决这些...
- **所有数位相加**:计算一个整数中所有数字的总和。 #### Number数论 - **递推求欧拉函数PHI(I)**:计算欧拉函数φ(i),即小于i且与i互质的正整数的数量。 - **单独求欧拉函数PHI(X)**:计算欧拉函数φ(x)的具体...
文档包含了多种算法及其应用实例,覆盖了图论、网络流以及数据结构等多个领域,对于初学者和进阶学习者来说都是一个非常宝贵的资源。 #### 图论算法 1. **DAG的深度优先搜索标记** - DAG(有向无环图)的深度...
- **解析**:可以使用双指针技术,一个指向数组的开始,另一个指向数组的结束,然后交换这两个位置的元素,直到两个指针相遇。 #### 题目三十一至五十: - **描述**:涉及各种编程概念和算法的题目,包括但不限于...
- 最小割是指分割图使得两个子集间边权之和最小的切割。 - 适用于某些特定类型的图。 3. **有上下界的最小(最大)流** - 对于每条边设有流量限制的情况下的流问题。 - 实际网络流问题的常见形式。 4. **DINIC...
- **所有数位相加**:计算一个数的所有数字之和。 #### 五、Number 数论部分 ##### 4. Number 数论 数论是数学的一个分支,涉及整数性质的研究,特别是素数和整除性。 - **递推求欧拉函数PHI(I)**:计算一个数的...
一种构造4N魔方阵的方法是先构造一个N×N的奇数魔方阵,然后通过复制和变换来扩展成4N×4N的魔方阵。具体来说,可以将奇数魔方阵中的每个元素复制为4×4的子矩阵,然后对子矩阵进行适当的调整,以满足魔方阵的性质。...
内容及步骤: 1、 设有一个线性表(e0,e1,e2,e3,…,en-2,en-1)存放在一个一维数组A[arraySize]中的前n个数组元素位置。请编写一个函数将这个线性表原地逆置,即将数组的前n个原地址内容置换为(en-1,en-2,…,e3,...
其核心思想是将未排序的部分中取出一个元素,插入到已排序序列的适当位置。 - **选择排序**:通过在未排序部分寻找最小(或最大)元素,然后放到已排序序列的末尾来完成排序。 - **冒泡排序**:相邻元素两两比较,...