标签:syn evel clu 一个 部分 eve null define fine
一个关卡有玩家的尝试次数和通关次数,按时间顺序给出一个玩家 $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(); }
已知 $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(); }
有一圈怪兽,每个怪兽有 $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(); }
Educational Codeforces Round 85 (Div. 2) 部分题解
标签:syn evel clu 一个 部分 eve null define fine
原文地址:https://www.cnblogs.com/Kanoon/p/12677459.html