2024.12.9 週一

Jkke發表於2024-12-10

2024.12.9 週一


Q1. 1000

問是否可以用給定的n^2個數構造出已定n*n的矩陣。

Q2. 1200

給定2行n列陣列,從(1,1)走到(2,n),只能向右/下走。你可以任意交換2列,問經過元素的和的最大值。

Q3. 1200

你有任意張面值為1,3,6,10,15的紙幣。給定n,問湊出n元需要最小的紙幣張數。

Q4. 1400

給定字元迷宮,問作為起點無法出迷宮的位置數。

------------------------獨自思考分割線------------------------

  • 被Q3卡了。一個半小時結束,Q1+Q2半小時,Q3半小時,速度還可以。深搜比廣搜確實好寫...

A1. 2點

1.資料結構map維護個數,一一判斷。

2.另解:生成矩陣判等。

A2. 2點

1.2行註定有一個拐點。任意交換列代表可以任意排列。

2.分析本質:任意選擇n-1個max(a[i][0],a[i][1]),加上拐點的另一半,顯然未被選擇的最大值最優。

A3.

1. 好題:思維+暴力 / dp+貪心

A4. 2點

1.反向搜尋必出迷宮的塊。

2.搜尋剩下塊:對每個塊數量>1就可以做到無法出迷宮。

------------------------程式碼分割線------------------------

A1.

#include <bits/stdc++.h>
#define int long long //
#define endl '\n'     // 互動/除錯 關
using namespace std;
#define bug(BUG) cout << "bug:# " << (BUG) << endl
#define bug2(BUG1, BUG2) cout << "bug:# " << (BUG1) << " " << (BUG2) << endl
#define bug3(BUG1, BUG2, BUG3) cout << "bug:# " << (BUG1) << ' ' << (BUG2) << ' ' << (BUG3) << endl
void _();
signed main()
{
    ios::sync_with_stdio(0), cin.tie(0), cout.tie(0);
    cout << fixed << setprecision(6);
    int T = 1;
    cin >> T;
    while (T--)
        _();
    return 0;
}

void _()
{
    int n, c, d;
    cin >> n >> c >> d;
    map<int, int> has;
    for (int i = 0; i < n * n; i++)
    {
        int x;
        cin >> x;
        has[x]++;
    }
    int minw = (*has.begin()).first;
    int ans = 1;
    for (int i = 0; i < n; i++)
        for (int j = 0; j < n; j++)
        {
            if (!has[minw + i * c + j * d])
                ans = 0;
            else
                has[minw + i * c + j * d]--;
        }
    cout << (ans ? "YES" : "NO") << endl;
}

A2.

#include <bits/stdc++.h>
#define int long long //
#define endl '\n'     // 互動/除錯 關
using namespace std;
#define bug(BUG) cout << "bug:# " << (BUG) << endl
#define bug2(BUG1, BUG2) cout << "bug:# " << (BUG1) << " " << (BUG2) << endl
#define bug3(BUG1, BUG2, BUG3) cout << "bug:# " << (BUG1) << ' ' << (BUG2) << ' ' << (BUG3) << endl
void _();
signed main()
{
    ios::sync_with_stdio(0), cin.tie(0), cout.tie(0);
    cout << fixed << setprecision(6);
    int T = 1;
    cin >> T;
    while (T--)
        _();
    return 0;
}

void _()
{
    int m;
    cin >> m;
    vector<pair<int, int>> vec(m);
    for (auto &[x, y] : vec)
        cin >> x;
    for (auto &[x, y] : vec)
        cin >> y;
    int sum = 0, maxw = -1e12;
    for (auto [x, y] : vec)
    {
        maxw = max(maxw, min(x, y));
        sum += max(x, y);
    }
    cout << sum + maxw << endl;
}

A3.

#include <bits/stdc++.h>
#define int long long //
#define endl '\n'     // 互動/除錯 關
using namespace std;
#define bug(BUG) cout << "bug:# " << (BUG) << endl
#define bug2(BUG1, BUG2) cout << "bug:# " << (BUG1) << " " << (BUG2) << endl
#define bug3(BUG1, BUG2, BUG3) cout << "bug:# " << (BUG1) << ' ' << (BUG2) << ' ' << (BUG3) << endl
void _();
signed main()
{
    ios::sync_with_stdio(0), cin.tie(0), cout.tie(0);
    cout << fixed << setprecision(6);
    int T = 1;
    cin >> T;
    while (T--)
        _();
    return 0;
}

void _()
{
    int n;
    cin >> n;
    int res = 1e12;
    vector<int> vec{15, 10, 6, 3, 1};
    int cnt[] = {0, 2, 4, 1, 2};
    for (int i = 0; i <= 2; i++)
        for (int j = 0; j <= 4; j++)
            for (int k = 0; k <= 1; k++)
                for (int h = 0; h <= 2; h++)
                {
                    int x = n - (i * 10 + j * 6 + k * 3 + h);
                    if (x >= 0 && x % 15 == 0)
                        res = min(res, i + j + k + h + x / 15);
                }
    cout << res << endl;
}
// void _()
// {
//     int n;
//     cin >> n;
//     int res = 1e12;
//     int a[] = {1, 3, 6, 10, 15}, vis[5] = {};
//     vector<int> vec{15, 10, 6, 3, 1};
//     int vnt = 0;
//     auto get = [&]()
//     {
//         vnt++;
//         int t = 0, tn = n;
//         for (auto v : vec)
//         {
//             t += tn / v;
//             tn %= v;
//         }
//         res = min(res, t);
//         for (auto v : vec)
//             cout << v << ' ';
//         cout << endl;
//         bug(t);
//     };
//     function<void(int)> dfs = [&](int k)
//     {
//         if (k == 5)
//         {
//             get();
//             return;
//         }
//         for (int i = 0; i < 5; i++)
//             if (!vis[i])
//             {
//                 vis[i] = 1;
//                 vec[k] = a[i];
//                 dfs(k + 1);
//                 vis[i] = 0;
//             }
//     };
//     dfs(0);
//     cout << res << endl;
//     // bug(vnt);
// }

A4.

#include <bits/stdc++.h>
#define int long long //
#define endl '\n'     // 互動/除錯 關
using namespace std;
#define bug(BUG) cout << "bug:# " << (BUG) << endl
#define bug2(BUG1, BUG2) cout << "bug:# " << (BUG1) << " " << (BUG2) << endl
#define bug3(BUG1, BUG2, BUG3) cout << "bug:# " << (BUG1) << ' ' << (BUG2) << ' ' << (BUG3) << endl
void _();
signed main()
{
    ios::sync_with_stdio(0), cin.tie(0), cout.tie(0);
    cout << fixed << setprecision(6);
    int T = 1;
    cin >> T;
    while (T--)
        _();
    return 0;
}

void _()
{
    int n, m;
    cin >> n >> m;
    vector<string> s(n + 2);
    for (int i = 1; i <= n; i++)
    {
        cin >> s[i];
        s[i] = " " + s[i] + " ";
    }
    vector<vector<int>> vis(n + 2, vector<int>(m + 2));
    queue<pair<int, int>> q;
    vis[0][0] = 1;
    int dx[] = {1, -1, 0, 0}, dy[] = {0, 0, 1, -1};
    q.push({0, 0});
    while (q.size())
    {
        auto [x, y] = q.front();
        // bug2(x, y);
        q.pop();
        for (int i = 0; i < 4; i++)
        {
            int nx = x + dx[i], ny = y + dy[i];
            if (nx < 0 || nx > n + 1 || ny < 0 || ny > m + 1 || vis[nx][ny])
                continue;
            if (nx == 0 || nx == n + 1 || ny == 0 || ny == m + 1)
            {
                q.push({nx, ny});
                // bug2(nx, ny);
                vis[nx][ny] = 1;
            }
            else
            {
                if (i == 0)
                {
                    if (s[x + 1][y] - 'U')
                        continue;
                }
                else if (i == 1)
                {
                    if (s[x - 1][y] - 'D')
                        continue;
                }
                else if (i == 2)
                {
                    if (s[x][y + 1] - 'L')
                        continue;
                }
                else if (s[x][y - 1] - 'R')
                    continue;
                // bug(s[nx][ny]);
                q.push({nx, ny});
                vis[nx][ny] = 1;
            }
        }
    }

    int res = 0, cnt = 0;
    function<void(int, int)> dfs = [&](int i, int j)
    {
        if (vis[i][j])
            return;
        vis[i][j] = 1;
        cnt++;
        for (int k = 0; k < 4; k++)
            dfs(i + dx[k], j + dy[k]);
    };
    for (int i = 1; i <= n; i++)
        for (int j = 1; j <= m; j++)
            if (!vis[i][j])
            {
                cnt = 0;
                // bug2(i, j);
                dfs(i, j);
                res += cnt == 1 ? 0 : cnt;
            }
    cout << res << endl;
}