Educational Codeforces Round 85 (Div. 2)
题目链接:https://codeforces.com/contest/1334
A. Level Statistics
题意
一个关卡有玩家的尝试次数和通关次数,按时间顺序给出一个玩家 $n$ 个时刻的数据,判断这些数据是否合理。
思路
- 通关次数不会多于尝试次数:$c_i≤p_i$
- 后一时刻的尝试次数不会多于前一时刻:$p_i≤p_{i-1}$
- 后一时刻的通关次数不会多于前一时刻:$c_i≤c_{i-1}$
- 增加的通关次数不会多于增加的尝试次数:$c_i-c_{i-1}≤p_i-p_{i-1}$
代码
#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();
}
D. Minimum Euler Cycle
题意
求一个 $n$ 点完全有向图字典序最小的欧拉回路的一段区间。
如果图G中的一个路径包括每个边恰好一次,则该路径称为欧拉路径(Euler path)。如果一个回路是欧拉路径,则称为欧拉回路(Euler circuit)。
思路
因为是求字典序最小的回路,所以我们每次可以通过折返先走完较小的点,比如 $4$ 个点时:
每次以 1 为起点:1 2 1 3 1 4
每次以 2 为起点:2 3 2 4
每次以 3 为起点:3 4
回到 1 构成回路:1
- 观察发现前 $n-1$ 个区间长度为等差数列,即 $len_i=2*(n-i)$,
- 所以我们可以用前缀和 $pre\_sum$ 记录到每个区间时的元素总个数,之后可以据此用 $lower\_bound$ 二分查找第 $i$ 个元素所在的区间编号 $seg\_num$ 。
- 确认区间后,该元素编号减去之前区间的元素总个数即为该元素在该区间内的编号,即 $num = i - pre\_sum[seg\_num-1]$ 。
- 观察每个区间,因为是反复折返一个点,所以该区间内的奇数元素大小都等于 $seg\_num$,偶数元素大小等于 $seg\_num + num / 2$ 。
- 最后特判 $i > pre\_sum[n-1]\ return\ 1$ 即可。
代码
#include <bits/stdc++.h>
using ll = long long;
using namespace std; const int M = 1e5+100;
ll n, l, r, pre_sum[M]; int cal(ll x) {
if (x > pre_sum[n - 1]) return 1;
int seg_num = lower_bound(pre_sum, pre_sum + n, x) - pre_sum;
int num = x - pre_sum[seg_num - 1];
if (num & 1) return seg_num;
else return seg_num + num / 2;
} void solve() {
cin >> n >> l >> r;
for (int i = 1; i < n; i++) {
pre_sum[i] = pre_sum[i - 1] + 2 * (n - i);
}
for (ll i = l; i <= r; i++) {
cout << cal(i) << " \n"[i==r];
}
} int main() {
int t; cin >> t;
while (t--) solve();
}
D题代码参考自:MiFaFaOvO(dlstxdy)。
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\) 每天都可能会有人玩游戏,同时一部 ...
- Educational Codeforces Round 84 (Div. 2)
Educational Codeforces Round 84 (Div. 2) 读题读题读题+脑筋急转弯 = =. A. Sum of Odd Integers 奇奇为奇,奇偶为偶,所以n,k奇偶性 ...
- Educational Codeforces Round 58 Div. 2 自闭记
明明多个几秒就能场上AK了.自闭. A:签到. #include<iostream> #include<cstdio> #include<cmath> #inclu ...
- Educational Codeforces Round 47 (Div 2) (A~G)
目录 Codeforces 1009 A.Game Shopping B.Minimum Ternary String C.Annoying Present D.Relatively Prime Gr ...
- Educational Codeforces Round 46 (Div 2) (A~G)
目录 Codeforces 1000 A.Codehorses T-shirts B.Light It Up C.Covered Points Count(差分) D.Yet Another Prob ...
- Educational Codeforces Round 45 (Div 2) (A~G)
目录 Codeforces 990 A.Commentary Boxes B.Micro-World C.Bracket Sequences Concatenation Problem D.Graph ...
- Educational Codeforces Round 86 (Div. 2)
比赛链接:https://codeforces.com/contest/1342 A - Road To Zero 题意 有两个非负整数 x, y 以及两种操作: 支付 a 点代价使其中一个数加一或减 ...
- Educational Codeforces Round 119 (Div. 2), (C) BA-String硬着头皮做, 能做出来的
题目链接 Problem - C - Codeforces 题目 Example input 3 2 4 3 a* 4 1 3 a**a 6 3 20 **a*** output abb abba b ...
- Educational Codeforces Round 108 (Div. 2), C map套vector存储
地址 Problem - C - Codeforces 题目 题意 一个学校有n个人参加比赛,他们分别属于ui队,每个人的能力值为si 当每个队需要1~n个人的时候,这个学校能参加的人的能力值和最大 ...
随机推荐
- 【C++】《Effective C++》第八章
第八章 定制new和delete 对于程序开发来说,了解C++内存管理例程的行为是非常重要的.其中两个主角是分配例程和归还例程(operator new和operator delete),配角是new ...
- 【Flutter】功能型组件之跨组件状态共享
前言 在Flutter开发中,状态管理是一个永恒的话题. 一般的原则是:如果状态是组件私有的,则应该由组件自己管理:如果状态要跨组件共享,则该状态应该由各个组件共同的父元素来管理. 对于组 ...
- Docker haproxy应用构建 (五)
编写dockerfile from centos-base:v1 MAINTAINER 57674891@qq.com RUN mkdir -p /data/{soft,src,logs,script ...
- EGADS框架处理流程分析
最近在搞异常检测相关的工作,因此调研了业界常用的异常检测系统.通过查阅相关资料,发现业界对雅虎开源的EGADS系统评价比较高,其git项目已有980个star.这周阅读了项目的源码,梳理了系统框架的基 ...
- 关于spring-data与elasticsearch的使用,自定义repository
之前没有使用过spring-data,关于spring-data有很多很棒的设计,例如仅仅只需要声明一个接口就行,你甚至都不需要去实现,spring-data有内置默认的实现类,基本就上完成绝大多数对 ...
- pyi文件是干嘛的?(一文读懂Python的存根文件和类型检查)
参考资料: https://blog.csdn.net/weixin_40908748/article/details/106252884 https://www.python.org/dev/pep ...
- Assuming that agent dropped connection because of access permission
Assuming that agent dropped connection because of access permission
- kubernets之服务发现
一 服务与pod的发现 1.1 服务发现pod是很显而易见的事情,通过简称pod的标签是否和服务的标签一致即可,但是pod是如何发现服务的呢?这个问题其实感觉比较多余,但是接下来你就可能不这么想了 ...
- 05--Docker对DockerFile解析
一.是什么: 1.1 DockerFile是用来构建Docker镜像的构建文件,是由一系列命令和参数构成的脚本 1.2 构建步骤: 1.2.1 编写Dockerfile文件 1.2.2 docker ...
- Docker 建站小记
一,前言 Docker 建站小记,我使用了四个镜像来搭建:nginx,certbot,mysql,gradle.欢迎访问:https://www.zzk0.top 这个网页是从 github 上找的个 ...