Codeforces Round #687 (Div. 2, based on Technocup 2021 Elimination Round 2) (我的題解)

Codeforces Round #687 (Div. 2, based on Technocup 2021 Elimination Round 2)c++

A. Prison Break

https://codeforces.com/contest/1457/problem/Aspa

題意:給定一個n行m列的監獄(每一個(i,j)中均有犯人),犯人們爲了集體逃脫找到了一個洞口(r,c)點。如今請問最少須要多少秒才能全體逃脫。code

思路:只要計算一下邊角的犯人離出口的最大距離便可ci

void solve() {
    int n, m, r, c;
    cin >> n >> m >> r >> c;
    cout << max(r - 1, n - r) + max(c - 1, m - c) << endl;
}

B. Repainting Street

https://codeforces.com/contest/1457/problem/Bget

題意:Tom要爲一排房子粉刷顏色,每一個房子的都有它的顏色,因爲Tom認爲相同顏色的爲」美麗「,但Tom天天只能爲k個連續的房子進行粉刷。請問最少須要多少天才能變美麗string

思路:因爲僅100種顏色,能夠使用暴力枚舉 + 滑動窗口解決it

void solve() {
    int n, k;
    cin >> n >> k;
    int a[n + 1];
    for (int i = 0; i < n; ++i)
        cin >> a[i];
    int res = n;
    for (int c = 1; c <= 100; ++c) { //枚舉進行粉刷的顏色種類
        int last = -k, curr = 0;
        for (int j = 0; j < n; ++j) {
            if (a[j] == c)
                continue;
            if (last + k <= j) {
                last = j;
                curr++;
            }
        }
        res = min(res, curr);
    }
    printf("%d\n", res);
}

C. Bouncing Ball

https://codeforces.com/contest/1457/problem/Cio

string s;
void solve() {
    int n, p, k, x, y;
    cin >> n >> p >> k;
    p--;
    vector<int> b(n);
    cin >> s;
    cin >> x >> y;
    int ans = 1 << 30;
    for (int i = n - 1; 0 <= i; --i) {
        b[i] = !(s[i] == '1');
        if (i + k < n)
            b[i] += b[i + k];
        if (i >= p)
            ans = min(ans, (i - p) * y + b[i] * x);
    }
    printf("%d\n", ans);
}

E. New Game Plus!

https://codeforces.com/contest/1457/problem/East

理解好題意,利用前綴和貪心便可class

// Author : RioTian
// Time : 20/11/29
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
const int N = 5e5 + 5;
int n, k, a[N];
ll b[N], sum, res = -(1LL << 60), curr;
int main() {
    cin >> n >> k;
    for (int i = 1; i <= n; ++i)
        cin >> a[i];
    sort(a + 1, a + n + 1);
    for (int i = 1; i <= n; ++i) {
        b[i] = b[i - 1] + a[i];
        sum += 1LL * (i - 1) * a[i];
    }
    for (int i = 1; i <= n; ++i) {
        int mx = (i - 1 + k) / (k + 1), mn = (i - 1) / (k + 1);
        res = max(res, (b[n] - b[i - 1]) * mx + curr + sum);
        sum -= (b[n] - b[i]);
        curr += 1LL * mn * a[i];
    }
    res = max(res, curr);
    cout << res << endl;
    return 0;
}
相關文章
相關標籤/搜索