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();
}

原文地址:https://www.cnblogs.com/Kanoon/p/12677459.html

时间: 2024-07-31 14:10:38

Educational Codeforces Round 85 (Div. 2) 部分题解的相关文章

Educational Codeforces Round 85 (Rated for Div. 2)

Educational Codeforces Round 85 (Rated for Div. 2) A. Level Statistics 签到题, 要求第一位维单增, 第二维变化比第一维慢, 直接模拟即可 B. Middle Class 题目大意 每个人有一些财富, 财富值超过x的人称为富人, 由于实行共产主义, 你可以将某些人的财产重新分配使得富人最多 解题思路 直接按财富值排序, 从大到小加入富人集合, 如果当前富人集合财富平均值小于x就break掉 C. Circle of Monst

# Codeforces Round #529(Div.3)个人题解

Codeforces Round #529(Div.3)个人题解 前言: 闲来无事补了前天的cf,想着最近刷题有点点怠惰,就直接一场cf一场cf的刷算了,以后的题解也都会以每场的形式写出来 A. Repeating Cipher 传送门 题意:第一个字母写一次,第二个字母写两次,依次递推,求原字符串是什么 题解:1.2.3.4,非常明显的d=1的等差数列,所以预处理一个等差数列直接取等差数列的每一项即可 代码: #include<bits/stdc++.h> using namespace s

Codeforces Round #531 (Div. 3) ABCDE题解

Codeforces Round #531 (Div. 3) 题目总链接:https://codeforces.com/contest/1102 A. Integer Sequence Dividing 题意: 给一个数n,然后要求你把1,2.....n分为两个集合,使得两个集合里面元素的和的差的绝对值最小. 题解: 分析可以发现,当n%4==0 或者 n%3==0,答案为0:其余答案为1.之后输出一下就好了. 代码如下: #include <bits/stdc++.h> using name

Codeforces Round #540 (Div. 3) 部分题解

Codeforces Round #540 (Div. 3) 题目链接:https://codeforces.com/contest/1118 题目太多啦,解释题意都花很多时间...还有事情要做,就选一些题来写吧. B. Tanya and Candies 题意: 在n个数中任意删去一个,如果这个数被删去后,剩余数的奇数和以及偶数和相等,那么就定义这个数为"好数".现在问这n个数中有多少个“好数”. 题解: 预处理出奇数前缀和.偶数前缀和,删去一个数后所有的奇数位置和 就为前面的奇数和

Codeforces Round #632 (Div. 2) 部分题解

目录 Codeforces Round #632 (Div. 2) A. Little Artem B. Kind Anton C. Eugene and an array D. Challenges in school №41 F. Kate and imperfection Codeforces Round #632 (Div. 2) A. Little Artem 题意:略. 分析:构造这样的图形: BWW...W BWW...W BBB...B #include <bits/stdc++

【补题】Educational Codeforces Round 85 (Rated for Div. 2)

C题直接贪心,D题欧拉回路,理论上应该会做的-- 然后应该读题比较慢的关系,A题+B题各做了20分钟--还是15分钟内连切两道比较理想,毕竟挂了梯子,开CF的速度也不慢. C. Circle of Monsters \(n\)只怪物站成一圈,第\(i\)只怪物有\(a[i]\)点生命值和\(b[i]\)点爆炸伤害.当第\(i\)只怪物死亡时会爆炸,且只对第\(i+1\)只怪物造成\(b[i]\)点伤害.爆炸可以传递.每次开枪会对其中一只怪物造成\(1\)点伤害,求能杀死全部怪物的最小开枪次数.

Codeforces Round #353 (Div. 2) ABCDE 题解 python

Problems # Name     A Infinite Sequence standard input/output 1 s, 256 MB    x3509 B Restoring Painting standard input/output 1 s, 256 MB    x2519 C Money Transfers standard input/output 1 s, 256 MB    x724 D Tree Construction standard input/output 2

Codeforces Round #Pi (Div. 2) (ABCD题解)

比赛链接:http://codeforces.com/contest/567 听说Round #Pi的意思是Round #314... A. Lineland Mail time limit per test:3 seconds memory limit per test:256 megabytes All cities of Lineland are located on the Ox coordinate axis. Thus, each city is associated with it

Codeforces Round #498 (Div. 3) 简要题解

[比赛链接] https://codeforces.com/contest/1006 [题解] Problem A. Adjacent Replacements        [算法] 将序列中的所有偶数替换为奇数即可 时间复杂度 : O(N) [代码] #include<bits/stdc++.h> using namespace std; template <typename T> inline void chkmax(T &x,T y) { x = max(x,y);