2 条题解

  • 1
    @ 2023-12-29 19:09:57

    补一个 20 分的暴力做法

    #include <bits/stdc++.h>
    using namespace std;
    const int MAXN = 40;
    int n;
    int a[MAXN + 5], L[MAXN + 5], R[MAXN + 5];
    int minDis, minCost;
    // 处于 (x,y) 的位置,之前的总代价为 pre,方向为 fx
    // x 正方向为 0,顺时针依次 0,1,2,3
    // 要进行第 now 次抉择
    void dfs(int now, int x, int y, int pre, int fx)
    {
        if (now > n)
        {
            if (x * x + y * y < minDis)
            {
                minDis = x * x + y * y;
                minCost = pre;
            }
            else if (x * x + y * y == minDis)
                minCost = min(minCost, pre);
            return;
        }
        if (fx == 0)
        {
            dfs(now + 1, x, y - a[now], pre + L[now], 1);
            dfs(now + 1, x, y + a[now], pre + R[now], 3);
        }
        else if (fx == 1)
        {
            dfs(now + 1, x - a[now], y, pre + L[now], 2);
            dfs(now + 1, x + a[now], y, pre + R[now], 0);
        }
        else if (fx == 2)
        {
            dfs(now + 1, x, y + a[now], pre + L[now], 3);
            dfs(now + 1, x, y - a[now], pre + R[now], 1);
        }
        else if (fx == 3)
        {
            dfs(now + 1, x + a[now], y, pre + L[now], 0);
            dfs(now + 1, x - a[now], y, pre + R[now], 2);
        }
    }
    int main()
    {
        ios::sync_with_stdio(false);
        cin.tie(0);
        cin >> n;
        minDis = 0;
        for (int i = 1; i <= n; i++)
        {
            cin >> a[i];
            minDis += a[i];
        }
        minDis *= minDis;
        for (int i = 1; i <= n; i++)
            cin >> L[i];
        for (int i = 1; i <= n; i++)
            cin >> R[i];
        dfs(1, 0, 0, 0, 0);
        cout << minCost << "\n";
        return 0;
    }
    

    信息

    ID
    1383
    时间
    2000ms
    内存
    256MiB
    难度
    10
    标签
    (无)
    递交数
    157
    已通过
    2
    上传者