Educational Codeforces Round 85 (Div. 2) 部分题解

A. Level Statistics

题意

一个关卡有玩家的尝试次数和通关次数,按时间顺序给出一个玩家 $n$ 个时刻的数据,判断这些数据是否合理。

思路

  • 通关次数不会多于尝试次数
  • 后一时刻的尝试次数不会少于前一时刻
  • 后一时刻的通关次数不会少于前一时刻
  • 每次增加的通关次数不会多于增加的尝试次数

代码

#include <bits/stdc++.h>
using namespace std;

void solve() {
    int n; cin >> n;
    int p[n], c[n];
    for (int i = 0; i < n; i++) {
        cin >> p[i] >> c[i];
    }
    for (int i = 0; i < n; i++) {
        if (c[i] > p[i]) {
            cout << "NO" << "\n";
            return;
        }
    }
    for (int i = 1; i < n; i++) {
        if (p[i] < p[i - 1] || c[i] < c[i - 1] || c[i] - c[i - 1] > p[i] - p[i - 1]) {
            cout << "NO" << "\n";
            return;
        }
    }
    cout << "YES" << "\n";
}

int main() {
    int t; cin >> t;
    while (t--) solve();
}

B. Middle Class

题意

已知 $n$ 个人财富值,可以不限次地选取一些人将他们的财富值汇总后平均分配,问最后最多有多少人财富值不少于 $x$ 。

思路

降序排列,分配多余的财富值,第一次不能凑齐 $x$ 时之前的人数即为答案。

代码

#include <bits/stdc++.h>
using ll = long long;
using namespace std;

void solve() {
    int n, x; cin >> n >> x;
    int a[n]; for (int & i : a) cin >> i;
    sort(a, a + n, greater<int>());
    ll extra = 0, ans = 0;
    for (int i : a) {
        if (i >= x) {
            extra += i - x;
            ++ans;
        } else if (extra >= x - i) {
            extra -= x - i;
            ++ans;
        }
    }
    cout << ans << "\n";
}

int main() {
    int t; cin >> t;
    while (t--) solve();
}

C. Circle of Monsters

题意

有一圈怪兽,每个怪兽有 $a_i$ 点生命值,每射击 $1$ 次怪兽会掉 $1$ 点生命值,当怪兽死亡时会对下一个怪兽造成 $b_i$ 点伤害,要想消灭所有怪兽最少需要射击多少次。

思路

先求出至少需要射击多少次,即 $\sum_{i=0}^{n-1}a[i] - b[i-1]$,然后枚举以哪只怪兽为起点,取总和的最小值即可。

代码

#include <bits/stdc++.h>
#define pre(i) ((i - 1 + n) % n)
using ll = long long;
using namespace std;

void solve() {
    int n; cin >> n;
    ll a[n], b[n];
    for (int i =0 ; i < n; i++) {
        cin >> a[i] >> b[i];
    }
    ll sum = 0;
    for (int i = 0; i < n; i++) {
        sum += max(0LL, a[i] - b[pre(i)]);
    }
    ll ans = 1e18;
    for (int i = 0; i < n; i++) {
        if (a[i] > b[i]) {
            ans = min(ans, sum + b[i]);
        } else {
            ans = min(ans, sum + a[i]);
        }
    }
    cout << ans << "\n";    
}

int main() {
    ios::sync_with_stdio(false);
    cin.tie(nullptr);
    int t; cin >> t;
    while (t--) solve();
}

猜你喜欢

转载自www.cnblogs.com/Kanoon/p/12677459.html