AC答案:ALGO-998:算法训练 娜神平衡
已经尝试过了,是AC
难点在于两个,第一个是每一次操作完成后,A中数之和与B中数之和的差不能超过r,是每一次操作完成后;第二个就是注意输入中n个数的第一个必须分入A组,也就是说,序列的第一个要放进去A组。剩下的……就是暴力搜索。主要考验细心。换句话说我是瞎的,nmd足足试了这么久。
#include <iostream>
#include <algorithm>
#include <vector>
using namespace std;
long long count_sum(vector<long long> arr)
{
long long result = 0;
for (int i = 0; i < arr.size(); i++)
{
result += arr[i];
}
return result;
}
void paint(vector<long long> arr)
{
for (int i = 0; i < arr.size(); i++)
{
cout << arr[i];
if (i < arr.size() - 1)
{
cout << ' ';
}
}
}
void check(vector<long long> arr, int size, int r, vector<long long> a, vector<long long> b)
{
if (llabs(count_sum(a) - count_sum(b)) > r)
{
return;
}
if (size == 0)
{
sort(a.begin(), a.end());
sort(b.begin(), b.end());
paint(a);
cout << endl;
paint(b);
exit(0);
}
else
{
for (int i = 0; i < arr.size(); i++)
{
if (arr[i] == -1)
{
continue;
}
unsigned temp = arr[i];
a.push_back(temp);
arr[i] = -1;
check(arr, size - 1, r, a, b);
arr[i] = temp;
a.pop_back();
if (i != 0)
{
b.push_back(temp);
arr[i] = -1;
check(arr, size - 1, r, a, b);
arr[i] = temp;
b.pop_back();
}
}
}
}
int main()
{
int n, r;
cin >> n >> r;
vector<long long> arr;
for (int i = 0; i < n; i++)
{
long long t = 0;
cin >> t;
arr.push_back(t);
}
check(arr, arr.size(), r, vector<long long>(), vector<long long>());
}