题目:给定一个元素个数为偶数的数组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;
}