408计算机考研--数据结构--2020年统考真题(C语言)

2020年408统考真题(C语言)

一、题目描述

定义三元组(a,b,c)(a、b、c均为正数)的距离D=|a-b|+|b-c|+|c-a|。给定3个非空整数集合S1、S2、S3,按升序分别存储在3个数组中。请设计一个尽可能高效的算法,计算并输出所有可能的三元组(a,b,c)(a∈S1,b∈S2,c∈S3)中的最小距离。例如S1={-1,0,9},S2={-25,-10,10,11},S3={2,9,17,30,41},则最小距离为2,相应的三元组为(9,10,9)。

二、算法的基本思想

①使用Dmin记录所有已处理的三元组的最小距离,初值为一个足够大的整数。
②集合S1、S2和S3分别保存在数组A、B、C中。数组的下标变量i=j=k=0,当i<|S1|、j<|S2|且k<|S3|时(|S|表示集合中的元素个数),循环执行下面的a)~c)。
a)计算(A[i],B[j],C[k])的距离D;(计算D)
b)若D<Dmin,则Dmin=D;(更新D)
c)将A[i]、B[j]、C[k]中的最小值的下标+1;
③输出Dmin,结束

三、算法实现
#define INT_MAX 0x7fffffff
int abs_(int a){//计算绝对值
	if(a<0) return -a;
	else return a;
}
bool xls_min(int a,int b,int c){//a是否是三个数中的最小值
	if(a<=b&&a<=c) return true;
	return false;
}
int findMinofTrip(int A[],int n,int B[],int m,int C[],int p){
	//D_min用于记录三元组的最小距离,处置赋为INT_MAX
	int i=0,j=0,k=0,D_min=INT_MAX,D;
	while(i<n&&j<m&&k<p&&D_min>0){
		D=abs_(A[i]-B[j])+abs_(B[j]-C[k])+abs_(C[k]-A[i]);
		if(D<D_min) D_min=D;
		if(xls_min(A[i],B[j],C[k])) i++;
		else if(xls_min(B[j],C[k],A[i])) j++;
		else k++;
	}
	return D_min;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值