欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

浙江大学软件学院2020年保研上机模拟练习 7-2 Distance of Triples

程序员文章站 2022-05-19 20:58:59
...

思路一:

3个数组都按照小到大排序,设置3个指针,起始都在数组的末尾,如果1个指针向前移动1位可以让对应元素和另两个数组元素的距离之和减小,则移动它。如果某一回合三个指针都没动,就跳出循环。

非满分:23/25,应该是数据比较弱。

思路一代码:

#include<cstdio>
#include<vector>
#include<iostream>
#include<algorithm>

using namespace std;

const int maxn = 10010;

int A[maxn],B[maxn],C[maxn];

int main(){ 

	int la,lb,lc;
	cin>>la>>lb>>lc;
	
	for(int i=0;i<la;i++){
		cin>>A[i];
	}
	sort(A,A+la);
	for(int i=0;i<lb;i++){
		cin>>B[i];
	}
	sort(B,B+lb);
	for(int i=0;i<lc;i++){
		cin>>C[i];
	}
	sort(C,C+lc);
	
	
	int ia = la-1,ib = lb-1,ic = lc-1;
	while(ia>0||ib>0||ic>0){
		bool changed = false;
		if(abs(A[ia-1]-B[ib])+abs(A[ia-1]-C[ic])<abs(A[ia]-B[ib])+abs(A[ia]-C[ic])&&ia>0){
			ia--;
			changed = true;
		}
		if(abs(A[ia]-B[ib-1])+abs(B[ib-1]-C[ic])<abs(A[ia]-B[ib])+abs(B[ib]-C[ic])&&ib>0){
			ib--;
			changed = true;	
		}
		if(abs(A[ia]-C[ic-1])+abs(B[ib]-C[ic-1])<abs(A[ia]-C[ic])+abs(B[ib]-C[ic])&&ic>0){
			ic--;
			changed = true;
		}
		if(changed == false)break;
	}
	int minD = abs(A[ia]-B[ib])+abs(A[ia]-C[ic])+abs(B[ib]-C[ic]);
	
	printf("MinD(%d, %d, %d) = %d",A[ia],B[ib],C[ic],minD);
	
	return 0;
}

相关标签: 算法题 数学题