主要的思路是用双指针得到最接近的两个和
#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;
int f(vector<int> &nums)
{
sort(nums.begin(), nums.end());
int i = 0, j = nums.size() - 1;
int sum1 = 0, sum2 = 0;
while (i <= j)
{
if (sum1 <= sum2)
{
sum1 += nums[i];
i++;
}
else
{
sum2 += nums[j];
j--;
}
}
if (sum1 >= sum2)
return sum1;
else
return sum2;
}
int main()
{
int sum = 0;
int n1, n2, n3, n4;
cin >> n1 >> n2 >> n3 >> n4;
vector<int> s1(n1), s2(n2), s3(n3), s4(n4);
for (int i = 0; i < n1; i++)
cin >> s1[i];
for (int i = 0; i < n2; i++)
cin >> s2[i];
for (int i = 0; i < n3; i++)
cin >> s3[i];
for (int i = 0; i < n4; i++)
cin >> s4[i];
sum += f(s1);
sum += f(s2);
sum += f(s3);
sum += f(s4);
cout << sum << endl;
return 0;
}