2019.4.3拼多多笔试第一题

题目:给定一个元素个数为偶数的数组arr,将该数组中的元素两两配对并求和,在这些和中选出最大和最小值,请问该如何对其两两配对,才能让最大值和最小值的差为最小?
输入描述:
一共2行输入。
第一行为一个整数n,2<=n<=10000,第二行为n个数,组成目标数组,每个数大于等于2,小于等于100。中间用空格隔开。
输出描述:
输出最小的差值。
例子:输入 6
23 45 65 23 78 59
输出 16
解法思路:先用vector 的arr装下数组,然后把arr调用sort()排好序,用一个for循环将arr的首尾相加,类似于高斯求和,装到另一个vector arr2里去,这样得到的两两配对结果是方差最小的,再对arr2用sort()排序,那么arr2的*arr2.begin()就是最小值,*arr2.end()-1就是最大的值。它们相减就是最小的差值。还有一种办法是直接开arr[101]的数组,数就是对应的arr[i]的i, arr[i]的值就是存的数的个数。第二种方法也贴出代码了。
方法一:

#include<iostream>
#include<vector>
#include<algorithm>
using namespace std;
int main() {
	vector<int> arr,arr2;
	int n = 0;
	cin >> n;
	for (int i = 0; i < n; i++) {
		int temp;
		cin >> temp;
		arr.push_back(temp);
	}
	sort(arr.begin(), arr.end());
	for (int i = 0,j=arr.size()-1; i < arr.size(); i++) {
		arr2.push_back(arr[i] + arr[j - i]);
	}
	sort(arr2.begin(), arr2.end());
	n =  *(arr2.end() - 1)- *arr2.begin() ;
	cout << n;
	return 0;
}

方法二:

#include"stdafx.h"
#include<iostream>
#include<algorithm>
using namespace std;
int main() {
	int arr[101] = { 0 }, arr2[201] = { 0 };
	int n = 0;
	cin >> n;
	for (int i = 0; i < n; i++) {
		int temp;
		cin >> temp;
		arr[temp]++;
	}
	for (int i = 2 , j = 100; i < j;  ) {
		if (arr[i] != 0 && arr[j] != 0) {
			arr2[ i+j ]++;
			arr[i]--;
			arr[j]--;
		}
		else if (arr[i] != 0 && arr[j] == 0) {
			--j;
		}
		else if (arr[i]==0 && arr[j] !=0){
			++i;
		}
		else
		{
			--j;
			++i;
		}
	}
	int k = 4;
	int g = 200;
	while (1) {
		if (arr2[k] != 0 && arr2[g] != 0) {
			n = g - k;
			break;
		}
		else if (arr2[k] != 0 && arr2[g] == 0) {
			--g;
		}
		else if (arr2[k] == 0 && arr2[g] != 0) {
			++k;
		}
		else
		{
			--g;
			++k;
		}
	}
	cout <<n<<endl;
	return 0;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值