题面

A B C D E F G H

难度:红 橙 黄 绿 蓝 紫 黑 黑

题解

A

题目大意:

输入 \(a\),\(b\),解不等式 \(b - 2x \le a - x (0 \le x \le a)\),输出 \(a - x_{min}\)。

解题思路:移项,得 \(x \ge b - a\)。

#include <bits/stdc++.h>
using namespace std;
int t, a, b;
int main() {
scanf("%d", &t);
while (t--) {
scanf("%d%d", &a, &b);
if (a >= b) printf("%d\n", a);
else {
int x = b - a;
if (x <= a) printf("%d\n", a - x);
else printf("0\n");
}
}
return 0;
}

B

洛谷上这道题的题意翻译是我写的。

题目大意:

本题有多组测试数据。

有一台柠檬水自动售货机。机器上有 \(n\) 个槽位和 \(n\) 个按钮,每个槽位对应一个按钮,但你并不知道每个按钮对应的是哪个槽位。

当您按下第 \(i\) 个按钮时,有两种可能的事件:

  • 若 \(i\) 号槽位有至少一瓶柠檬水,则其中一瓶柠檬水会从这个槽位里掉下来,然后你会把它取走。
  • 若 \(i\) 号槽位没有柠檬水,则什么都不会发生。

柠檬水下落速度很快,因此您看不清它从哪个槽位掉出。您只知道每个槽位中瓶装柠檬水的数量 \(a_i(1 \le a_i \le 10^9)\)

您需要求出至少收到 \(k\) 瓶柠檬水的最小按按钮次数。

数据保证机器中至少存在 \(k\) 瓶柠檬水。

题目分析:

贪心+排序。

定义“按钮按空”表示:该按钮按下若干次后,不再掉下柠檬水(即对应槽位中没有柠檬水)。

设当前有柠檬水的槽位中,数量最少的槽位为 \(p\),显然对于每个已知按下能掉出柠檬水的按钮,至少需要按 \(a_p\) 次,才能使这些按钮中存在“被按空”的按钮。

因此考虑进行如下操作:找到所有有柠檬水的槽位中,数量最少的槽位的柠檬水数,设为 \(x\),然后对于所有“没有被按空”的按钮,每个分别按下 \(x\) 次。由于是最坏情况,下一个按钮将“被按空”。此时标记这个按钮,并在下一轮中不再按下它。

解题思路:

可以考虑从小到大对数组 \(a\) 排序,再从小到大进行枚举,直到已经掉出的柠檬水数量达到 \(k\)。

总时间复杂度 \(O(n \text{log} n)\)。

注:写下这篇题解时,作者想要复习一下堆的用法。

#include <bits/stdc++.h>
using namespace std;
long long n, k, a[200010];
priority_queue<long long, vector<long long>, greater<long long> > q;
int main() {
long long t;
scanf("%lld", &t);
while (t--) {
while (!q.empty()) q.pop();
scanf("%lld%lld", &n, &k);
for (long long i = 1; i <= n; i++) {
scanf("%lld", &a[i]);
q.push(a[i]);
}
long long tmpn = n, cnt = 0;
long long ans = 0;
while (true) {
if ((q.top() - cnt) * tmpn >= k) {
ans += k;
break;
}
ans += (q.top() - cnt) * tmpn + 1;
k -= (q.top() - cnt) * tmpn;
tmpn--;
cnt = q.top();
q.pop();
}
printf("%lld\n", ans);
}
return 0;
}

C

题目大意:

有 \(n\) 个二元组 \(a_i(1 \le i \le n)\)。需要将二元组拼接形成一个序列,使序列中的逆序对个数最少。求这个序列。

题目分析:

不难想到贪心。观察可以发现对于二元组 \(a_i=(p, q)\),以 \(p+q\) 为关键字进行升序排序可以得到答案。

#include <bits/stdc++.h>
using namespace std;
struct akioi {
int a, b;
} dat[100010];
int n, t;
bool cmp(akioi a, akioi b) { return a.a + a.b < b.a + b.b; }
int main() {
scanf("%d", &t);
while (t--) {
scanf("%d", &n);
for (int i = 1; i <= n; i++) {
scanf("%d%d", &dat[i].a, &dat[i].b);
}
sort(dat + 1, dat + n + 1, cmp);
for (int i = 1; i <= n; i++) {
printf("%d %d ", dat[i].a, dat[i].b);
}
}
return 0;
}

D

题目大意:

Prokhor 想要参加 IOI 3024。比赛共有 \(n\) 道题,参赛者会先看到第 \(1\) 题。比赛规则和现行规则有区别。

当他看到第 \(i\) 题时有两种可能的操作:

  • A 了这道题,并获得 \(a_i\) 分;
  • 放弃这道题。

不论执行哪种操作,第 \(i\) 题都被标记“已访问”。

接着,他会看到编号为 \(j\) 的问题。对于两种操作:

  • 若 A 了第 \(i\) 题,则有条件 \(j \le i\);
  • 若放弃第 \(i\) 题,则有条件 \(j \le b_i\)。

无论如何,第 \(j\) 题应“未被访问过”。此时取满足条件 \(j\) 的最大值。

当不存在合法 \(j\) 的时候比赛结束。显然,如果他 A 了第 \(1\) 题,则比赛立即终止。

Prokhor 很 FAKE,所以他能 AK IOI。你需要帮他确定一种做题方案使得他获得全场最高分。

题目分析:

注意到到达第 \(i\) 个题的最大得分为左右题的总分减去放弃的题的分数。于是改为求最少的跳过分数。不难想到 Dijkstra。由于第 \(i\) 个题放弃时会跳转到第 \(b_i\) 题(假设该题目未访问),同时失去了 \(a_i\) 分,所以从 \(i\) 向 \(b_i\) 连边,权值为 \(a_i\);由于第 \(i\) 题回答完会跳转到第 \(i - 1\) 题(假设该题目未访问),没有失去分数,所以从 \(i\) 向 \(i - 1\) 连边,权值为 \(0\)。

答案为 $$ (\sum _ {j=1} ^ i a_i - \text{dis}_i) _{max}$$,其中 \(\text{dis}_i\) 表示从 \(1\) 到 \(i\) 的最短路。

#pragma GCC optimize(3)
#include <bits/stdc++.h>
using namespace std;
#define int long long
struct Edge {
int y, w;
};
struct Node {
int y, d;
bool operator < (const Node &n1) const {
return d > n1.d;
}
};
const int inf = 0x3f3f3f3f;
const int N = 400005;
int n, d[N], a[N], b[N];
vector<Edge> g[N];
bool vis[N];
void dijkstra(int v0) {
priority_queue<Node> q;
for (int i = 1; i <= n; i++) {
vis[i] = false;
d[i] = 0x7f7f7f7f7f7f7f7f;
}
d[v0] = 0;
q.push((Node) {
v0, 0
});
while (!q.empty()) {
Node n1 = q.top();
q.pop();
int x = n1.y;
if (vis[x]) continue;
vis[x] = true;
for (int j = 0; j < g[x].size(); j++) {
Edge next = g[x][j];
int y = next.y, w = next.w;
if (vis[y]) continue;
if (d[x] + w < d[y]) {
d[y] = d[x] + w;
q.push((Node) {
y, d[y]
});
}
}
}
}
char buf[1 << 20], *p1, *p2;
inline char gc() { return p1 == p2 ? p2 = buf + fread(p1 = buf, 1, 1<<20, stdin), (p1 == p2) ? EOF : *p1++ : *p1++; }
inline int read() {
char c = gc(); int x = 0;
while (c < '0' || c > '9') c = gc();
while (c >= '0' && c <= '9') x = x * 10 + c - '0', c = gc();
return x;
}
inline void write(int x) {
if (x > 9) write(x / 10);
putchar(x % 10 ^ 48);
}
signed main() {
int t = read();
while (t--) {
n = read();
g[1].clear();
for (int i = 2; i <= n; i++) {
g[i].clear();
g[i].push_back({i - 1, 0});
}
for (int i = 1; i <= n; i++) {
a[i] = read();
}
for (int i = 1; i <= n; i++) {
b[i] = read();
g[i].push_back({b[i], a[i]});
a[i] += a[i - 1]; // qian zhui he
}
dijkstra(1);
int ans = 0;
for (int i = 1; i <= n; i++) {
ans = max(ans, a[i] - d[i]);
}
write(ans);
putchar('\n');
}
return 0;
}

E

题目大意:

在两个强连通图中连接 \(n\) 条有向边,使得:

  • 每个环的长度为 \(k\) 的倍数;
  • 所有“入点”恰好多一条入边;
  • 所有“出点”恰好多一条出边;
  • 每条边从其中一个强连通图出发,指向另一个强连通图。

题目分析:

还是看这个吧,这是官方题解。下面是文章翻译:

考虑一个强连通图,其中所有环的长度都是 \(k\) 的倍数。注意到,总是可以用 \(k\) 种颜色给这个图上色,使得任何一条边都可以将一个颜色为 \(c\) 的顶点连接到一个颜色为 \((c+1) \% k\) 的顶点。不难发现,只有当这些边保持所描述的颜色不变时,我们才能向图中添加边。

让我们给原图上一些颜色。使用固定的颜色,很容易检查是否可以添加所需的边。为此,我们将为每种颜色和每种顶点创建相应的 \(cnt\) 数组,然后我们将根据上面提到的标准比较数组的元素。然而,我们最初可以用不同的方式给第二个图上色,例如,通过在每个顶点的颜色上加上 \(1\) 对 \(k\) 取模。不难验证第二个图的计数数组的所有值在一个周期内都会移动 \(1\)。同样,根据颜色的不同,所有的值都可以循环地任意移动。为了解决这个问题,我们将以这样一种方式构造初始数组,对于固定的着色,需要检查它们是否相等。如果对某些着色实现了相等,则意味着一个数组是另一个数组的循环移位。可以使用 KMP 算法检查这种情况。

Codeforces 2023/2024 A-H的更多相关文章

  1. Codeforces Gym 100610 Problem H. Horrible Truth 瞎搞

    Problem H. Horrible Truth Time Limit: 1 Sec Memory Limit: 256 MB 题目连接 http://codeforces.com/gym/1006 ...

  2. Codeforces Gym 100342H Problem H. Hard Test 构造题,卡迪杰斯特拉

    Problem H. Hard TestTime Limit: 20 Sec Memory Limit: 256 MB 题目连接 http://codeforces.com/gym/100342/at ...

  3. codeforces Looksery Cup 2015 H Degenerate Matrix

    The determinant of a matrix 2 × 2 is defined as follows: A matrix is called degenerate if its determ ...

  4. Codeforces 1214 F G H 补题记录

    翻开以前打的 #583,水平不够场上只过了五题.最近来补一下题,来记录我sb的调试过程. 估计我这个水平现场也过不了,因为前面的题已经zz调了好久-- F:就是给你环上一些点,两两配对求距离最小值. ...

  5. codeforces Looksery Cup 2015 H Degenerate Matrix 二分 注意浮点数陷阱

    #include <cstdio> #include <cstring> #include <algorithm> #include <string> ...

  6. Codeforces Round #454 C. Shockers【模拟/hash】

    C. Shockers time limit per test 2 seconds memory limit per test 256 megabytes input standard input o ...

  7. 2017"百度之星"程序设计大赛 - 初赛(A)今夕何夕

    Problem Description 今天是2017年8月6日,农历闰六月十五. 小度独自凭栏,望着一轮圆月,发出了“今夕何夕,见此良人”的寂寞感慨. 为了排遣郁结,它决定思考一个数学问题:接下来最 ...

  8. HDU 6112 今夕何夕

    今夕何夕 Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total Submis ...

  9. 2017"百度之星"程序设计大赛 - 初赛(A) 01,05,06

    小C的倍数问题    Time Limit: 2000/1000 MS (Java/Others)  Memory Limit: 32768/32768 K (Java/Others) Problem ...

  10. HDU 2021 发工资咯:)(最水贪心)

    传送门: http://acm.hdu.edu.cn/showproblem.php?pid=2021 发工资咯:) Time Limit: 2000/1000 MS (Java/Others)    ...

随机推荐

  1. Camera | 6.v4l2拓扑架构

    一. 设备节点.模块.拓扑结构关系 拓扑结构是我们了解MIPI-CSI内部模块以及与摄像头连接关系的最直观最便捷的方法. 1. 如何表示拓扑结构? file视角 v4l2视角 来自: 参考文档< ...

  2. Qt 设置快捷键

    Qt设置快捷键 本文仅供本人知识总结使用,所以内容会比较浅显,不喜勿喷. 文章目录 Qt设置快捷键 一.需要的类 QShortcut 函数: 二.设置快捷键 官方文档原文翻译: 我的理解: 一.需要的 ...

  3. Unix、Linux、GNU 关系梳理

    之前写了一篇 MSYS2.MinGW 和 Cygwin 关系梳理的博客,但是要讲清它们几个的关系最好还是先了解一下操作系统的发展历程.遂补充了这篇博客. UNIX:现代操作系统的始祖 Operatin ...

  4. 使用 Microsoft Remote Desktop 远程连接 Windows

    Windows 使用 Microsoft 帐户登录 远程连接时使用的用户名和密码是你的 Microsoft 帐户的用户名和密码 Windows 使用本地帐户登录 远程连接时使用的用户名和密码是你本地登 ...

  5. 【YashanDB知识库】主备延迟故障分析方法

    [标题]主备延迟故障分析方法 [问题分类]故障分析 [关键字]Yashandb.主备延迟 [问题描述]当数据库备机出现回放延迟时,需要通过一些手段分析延迟的原因.通过数据库的系统视图或操作系统监控数据 ...

  6. 【YashanDB数据库】大事务回滚导致其他操作无法执行,报错YAS-02016 no free undo blocks

    问题现象 客户将一个100G的表的数据插入到另一个表中,使用insert into select插入数据.从第一天下午2点开始执行,到第二天上午10点,一直未执行完毕. 由于需要实施下一步操作,客户k ...

  7. C++: 16个基础的C++代码性能优化实例

    前言 近期推动项目屎山代码进行了一波性能优化,实现了较大的性能提升.这里记录了部分近期代码优化的小技巧,这些例子仅从C++语言层面进行优化,主要在于优化类设计.减少隐含函数调用.减少拷贝等,较为基础实 ...

  8. Angular 18+ 高级教程 – 目录

    请按顺序阅读 关于本教程 初识 Angular Get Started Angular Compiler (AKA ngc) Quick View Dependency Injection 依赖注入  ...

  9. 记一次 公司.NET项目部署在Linux环境压测时 内存暴涨分析

    一:背景 讲故事 公司部署在某碟上的项目在9月份压测50并发时,发现某个容器线程.内存非正常的上涨,导致功能出现了异常无法使用.根据所学,自己分析了下线程和内存问题,分析时可以使用lldb或者wind ...

  10. k8s 中的 Ingress 简介

    〇.前言 前边已经介绍了 k8s 中的相关概念和 Service,本文继续看下什么是 Ingress. Ingress 的重要性不言而喻,它不仅统一了集群对外访问的入口,还提供了高级路由.七层负载均衡 ...