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>());
}
posted @ 2022-02-11 14:08  Lemon-GPU  阅读(301)  评论(0编辑  收藏  举报