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个人的时候,这个学校能参加的人的能力值和最大 ...
随机推荐
- Mac上最好用的软件集合,没有之一
前言 题主从 windows 系统换成 macOS 系统已经4年多了.对于没有用过 Mac 电脑的人来说,可能无法理解 Mac 好用在哪里.不过对于一个用过 Mac 的开发者来说,从 windows ...
- go mod 拉取私有仓库
前言 如果代码中依赖了本地的包, 这个包是托管在内网 Gitlab 中, 而且不是 HTTPS 服务,那么应该怎样使用 go mod 拉取代码呢? 本文会给你我的答案 正文 首先我们要知道, 如果本地 ...
- Java基础-数据类型及变量
Java基本语法 1.标识符(zhi) 含义:名字 类名.对象名.方法名.变量名.常量名-- 一个合法的标识符的组成:数字.字母._和$ 注意事项: 不能重复 不能以数字开头 区分大小写 不能以关键字 ...
- mysql中的kill
show processlist;查看id, 然后 kill id ; 就行了.
- 怎么判断innodb 日志缓冲区该设置为多大呢
怎么判断innodb 日志缓冲区该设置为多大呢
- buuctf刷题之旅—web—EasySQL
打开环境,发现依旧是sql注入 GitHub上有源码(https://github.com/team-su/SUCTF-2019/tree/master/Web/easy_sql) index.php ...
- 好你个C语言,原来还有这么多副面孔!
C语言可以这样比喻,是一门非常强大的内功心法,学会它可以做到一法通万法.这也是它至今不衰的原因.说了这么多C语言的优点,现在来说说它的缺点.C语言最大的优点也是它最大的缺点,拥有强大的力量时应时刻保持 ...
- ASP.NET MVC5+EF6+EasyUI 后台管理系统(89)-国际化,本地化,多语言应用
开篇 早年写过一篇多语言的应用 : 本地化(多语言) 讲述了如何创建多语言的资源文件,并利用资源文件来获得页面和请求的语言属性 本次补充这篇文章,的原因是在实际项目中,有多种需要多语言的情况 ...
- Centos7 添加用户及设置权限
一.添加用户 1.登录root 用户 [gau@localhost /]$ su Password: # 输入密码 [root@localhost /]# 2.添加用户 [root@localhost ...
- [阿里DIEN] 深度兴趣进化网络源码分析 之 Keras版本
[阿里DIEN] 深度兴趣进化网络源码分析 之 Keras版本 目录 [阿里DIEN] 深度兴趣进化网络源码分析 之 Keras版本 0x00 摘要 0x01 背景 1.1 代码进化 1.2 Deep ...