海贼oj#595. 程序调用关系

HZOJ-838:2020年数据结构41题

题目描述
定义三元组(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)。

程序中的主要部分已经帮你写好了,你只需要将如下代码拷贝到你的环境中,并且补充 func函数功能即可。函数功能描述如下:

输入参数
输入三个参数,分别为存储三个非空集合的队列

返回值说明
返回一个整形值,表示所有可能的三元组(a, b, c)(a∈S1,b∈S2,c∈S3)中的最小距离

#include <stdio.h>
#include <stdlib.h>

typedef struct Queue {
	int *data;
	int size,front,end;
} Queue;

Queue *initQueue(int n) {
	Queue *queue=(Queue *)malloc(sizeof(Queue));
	queue->data=(int *)malloc(sizeof(int)*n);
	queue->size=n;
	queue->front=queue->end=0;
	return queue;
}

int empty(Queue *queue) {
	return queue->front==queue->end;
}

int push(Queue *queue,int n) {
	if(queue->end==queue->size) return 0;
	queue->data[queue->end]=n;
	queue->end+=1;
	return 1;
}

int pop(Queue *queue) {
	if(empty(queue)) return 0;
	queue->front+=1;
	return 1;
}
int front(Queue *queue) {
	if(empty(queue)) return 0;
	return queue->data[queue->front];
}
int min(int a,int b,int c) {
	if(a>b) {
		if(b>c) return c;
		return b;
	} else {
		if(a>c) return c;
		return a;
	}
	return 0;
}

int solve(Queue *queue1,Queue *queue2,Queue *queue3) {
	int ans=0xffffff,temp_ans;
	while(!empty(queue1)&&!empty(queue2)&&!empty(queue3)) {
		int a=front(queue1),b=front(queue2),c=front(queue3),d;
		int temp_ans=abs(a-b)+abs(b-c)+abs(c-a);
		if(temp_ans<ans) ans=temp_ans;
		d=min(a,b,c);
		if(d==a) pop(queue1);
		if(d==b) pop(queue2);
		if(d==c) pop(queue3);
	}
	return ans;
}

int main(void) {
	int m,n,k,x;
	Queue *queue1,*queue2,*queue3;
	scanf("%d",&m);
	queue1=initQueue(m);
	scanf("%d",&n);
	queue2=initQueue(n);
	scanf("%d",&k);
	queue3=initQueue(k);
	for(int i=0; i<m; i++) {
		scanf("%d",&x);
		push(queue1,x);
	}
	for(int i=0; i<n; i++) {
		scanf("%d",&x);
		push(queue2,x);
	}
	for(int i=0; i<k; i++) {
		scanf("%d",&x);
		push(queue3,x);
	}
	x=solve(queue1,queue2,queue3);
	printf("%d\n",x);
	return 0;
}

————————————————

                        版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。

原文链接:https://blog.csdn.net/Mz_yuner/article/details/133181937

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值