2024.12.8 週日

Jkke發表於2024-12-09

2024.12.8 週日


Q1. 1100

給定n,k。構造長度為n的陣列,元素之和為k,且按位或和的值在二進位制下1最多。

Q2. 1300

給定兩行01串,從(1,1)走到(2,n),每次只能向右或向下走。問路徑經過的最小字串以及方案數。

Q3. 1200

將一個陣列分為連續的k>1段,使每段的MEX(未出現的最小自然數)相等。

Q4. 1400

給定n,m,k(1e9)與長度為n陣列vec:第i天價格。如果第i天買x張票,那麼以後每天的價格+x。每天最多買m張票,問買k張票的最小代價。

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

  • 這次的4道題都特別好。Q1wa了一發,Q2:45分鐘,Q3:50分鐘,Q4沒出。

A1. 2點

1.假思路:一個數構造一個1:1 2 4 8...

2.本質是考慮1數量的上限,構造小於等於k的數中1最多的數,最多2項即可。

A2. 2點

1.找到目標字串可以bfs,也可用點思維:發現僅有一個拐點(向下走),列舉尋找拐點,判斷方式:貪心一下發現a[2][i]<a[1][i+1]時作為拐點最優。

2.方案數用一下dp:f[i][j]=f[i-1][j]+f[i][j-1];

vector<array<int,3>>陣列開小了調了半天。

A3. 2點

1.發現小性質:若可以分為k段則一定可分為2段。

2.列舉分界點,資料結構維護左右MEX,更新加判斷。

A4.

1.思路不放了,放點思想。有點難度的貪心:一種貪心策略滿足兩層條件。

2.微擾法代替數學證明:簡單易懂。

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

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, k;
    cin >> n >> k;
    vector<int> res;
    for (int i = 0;; i++)
        if (k >> i == 0)
        {
            int t = (1ll << i - 1) - 1;
            res.push_back(t);
            break;
        }
    res.push_back(k - res[0]);
    for (int i = res.size() + 1; i <= n; i++)
        res.push_back(0);
    if (n == 1)
        res.assign(1, k);
    for (auto v : res)
        cout << v << ' ';
    cout << endl;
    // for (int i = 1; i < n; i++)
    // {
    //     if (k < st)
    //         break;
    //     k -= st;
    //     res.push_back(st);
    //     st <<= 1;
    // }
    // res.push_back(k);
    // for (int i = res.size() + 1; i <= n; i++)
    //     res.push_back(0);
    // for (auto v : res)
    //     cout << v << ' ';
    // cout << 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 n;
    cin >> n;
    vector<string> a(3);
    for (int i = 1; i <= 2; i++)
    {
        cin >> a[i];
        a[i] = " " + a[i];
    }
    int o = n;
    for (int i = 1; i < n; i++)
        if (a[2][i] < a[1][i + 1])
        {
            o = i;
            break;
        }
    string res = a[1].substr(1, o) + a[2].substr(o);
    cout << res << endl;
    res = " " + res;
    vector<vector<int>> f(3, vector<int>(n + 1));
    f[1][0] = 1;
    for (int i = 1; i <= 2; i++)
        for (int j = 1; j <= n; j++)
        {
            int t = i == 1 ? 0 : 1;
            if (a[i][j] - res[t + j])
                continue;
            if (i == 1)
                f[i][j] = f[i][j - 1];
            else
                f[i][j] = f[i - 1][j] + f[i][j - 1];
        }
    cout << f[2][n] << 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;
    vector<int> a(n + 1);
    for (int i = 1; i <= n; i++)
        cin >> a[i];
    map<int, int> MEX_l, MEX_r, l, r;
    l[a[1]]++;
    for (int i = 2; i <= n; i++)
        r[a[i]]++;
    for (int i = 0; i <= n; i++)
        if (!l.count(i))
            MEX_l[i] = 1;
    for (int i = 0; i <= n; i++)
        if (!r.count(i))
            MEX_r[i] = 1;
    auto seg = [](int l, int r)
    {
        cout << l << " " << r << endl;
    };
    auto same = [&]()
    {
        return (*MEX_l.begin()).first == (*MEX_r.begin()).first;
    };
    auto get = [&]()
    {
        bug2((*MEX_l.begin()).first, (*MEX_r.begin()).first);
    };
    // get();
    if (same())
    {
        // get();
        cout << 2 << endl;
        seg(1, 1);
        seg(2, n);
        return;
    }
    for (int i = 2; i < n; i++)
    {
        if (MEX_l.count(a[i]))
            MEX_l.erase(a[i]);
        l[a[i]]++;
        r[a[i]]--;
        if (r[a[i]] == 0)
            MEX_r[a[i]] = 1;
        if (same())
        {
            // get();
            cout << 2 << endl;
            seg(1, i);
            seg(i + 1, n);
            return;
        }
    }
    cout << -1 << endl;
}
// void _()
// {
//     int n;
//     cin >> n;
//     vector<int> a(n + 1);
//     for (int i = 1; i <= n; i++)
//         cin >> a[i];
//     vector<int> di;
//     for (int i = 1; i <= n / i; i++)
//         if (n % i == 0)
//             di.push_back(i);
//     // bug(di.size()); // 17
//     for (auto len : di)
//     {
//         // bug(len);
//         vector<pair<int, int>> res;
//         map<int, int> ans;
//         for (int r = len; r <= n; r += len)
//         {
//             int l = r - len + 1;
//             res.push_back({l, r});
//             map<int, int> has;
//             for (int i = l; i <= r; i++)
//                 has[a[i]] = 1;
//             for (int i = 0;; i++)
//                 if (!has[i])
//                 {
//                     ans[i] = 1;
//                     break;
//                 }
//         }
//         if (ans.size() == 1)
//         {
//             cout << n / len << endl;
//             for (auto [l, r] : res)
//                 cout << l << ' ' << r << endl;
//             return;
//         }
//     }
//     cout << -1 << endl;
// }

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, k;
    cin >> n >> m >> k;
    vector<int> vec(n);
    for (int &x : vec)
        cin >> x;
    sort(vec.begin(), vec.end());
    int res = 0, pre = 0;
    for (auto v : vec)
    {
        int buy = min(k, m);
        k -= buy;
        res += buy * (pre + v);
        pre += buy;
    }
    cout << res << endl;
}

相關文章