408计算机考研--数据结构--2020年统考真题(C语言)
程序员文章站
2024-02-17 11:58:46
...
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;
}