题目连接

A B C D E

题目分析

A

难度:普及−

题面翻译:

给你三张牌:\(0\),\(1\),\(2\)。

最初选一张,然后依次进行 \(n\) 次交换,交换规则为:中间一张和左边的一张,中间一张和右边一张,中间一张和左边一张……

最后问选的那张在哪个位置。

算法标签:模拟、枚举、构造、数学

题解:

注意到每 \(6\) 次操作为一个周期,在经过一周期后序列被还原成操作前的形态。因此打个表然后直接做就做完了。


B

难度:普及−

题面翻译:

有两个人 S 和 M,他们每人有一段长度为 \(N\) 的数字,两个人在每一轮游戏中都可以按顺序拿出一个数字,谁的数字小谁就接受一次惩罚。若相等两者都没有惩罚。另外,M 可以重新安排自己数字的顺序,问 M 的最少被惩罚次数和 S 的最多被惩罚次数是多少。

算法标签:博弈论、数据结构、贪心、排序

题解:

先排个序。

根据一篇著名的博弈论论文\(^{[1]}\),有以下策略:

  1. 若此轮能赢,则使用最小的能赢下来的牌。
  2. 若此轮不能赢,则出当前最小的牌。

证明在原论文内,此处略。

设 S 的牌为 \(s_i\),M 的牌为 \(m_i\)。显然,对于第一问,只要 \(s_i \ge m_i\) 就能出 \(m_i\) 这张牌。

而对于第二问,出牌条件改为 \(s_i>m_i\) 即可。

参考资料:

[1] Sima Qian.The Biography of Sun Wu & Wu Qi[A]Records of the Grand Historian[C].Chang'an:Yang Yun,91BCE:1-2


C

难度:普及+/提高

题面翻译:

给出一个 \(n\times m\) 的矩阵。对于第 \(j\) 列,如果满足 \(\forall i \in [1,n-1],a_{i,j} \leq a_{i+1,j}\),则称这一列是不下降的。

\(k\) 次询问,问如果只保留矩阵的第 \(L\)~\(R\) 行,矩阵中是否存在不下降的一列。

算法标签:二分、数据结构、动态规划、贪心、双指针

题解:

注意到本题和最长不下降子串有关。用 \(b_{i,j}\) 表示以 \(a_{i, j}\) 结尾的最长不下降子串起始位置的下标(注意不是长度),然后预处理出每一行最小的 \(b\) 即可在 \(O(1)\) 内查询。


D

难度:普及+/提高

题面翻译:

给出 \(n\) 个开头是 # 的字符串,你需要通过操作使这些字符串按字典序从小到大排列。

每次操作,你可以把某一个字符串的任意后缀去掉(当然你甚至可以去掉整个字符串),要求你去掉的字符数量最少。

输出你操作完的这 \(n\) 个字符串。

算法标签:二分、贪心、字符串

题解:

不难发现,本题和排序没有任何关系

注意到去除后缀会使字符串的字典序变小,因此 \(s_n\) 不需要变化。而对于 \(s_i(1\le i\le n-1)\),可以贪心的操作,使其刚好小于等于 \(s_{i+1}\)。因此从后往前操作即可。

E

难度:提高+/省选−

题面翻译:

给出 \(n\) 个环形零件的厚度、内径、外径,要求按以下条件装配若干圆盘后,形成的塔最高。

  • 圆盘应平放。也就是说,对于每个安放的零件,侧视图应当为长方形,而俯视图应为圆环。
  • 圆盘应叠放,而下方的圆盘外径应大于等于上方圆盘的外径。
  • 上方圆盘的外径应严格大于下方圆盘的内径(否则上方圆盘会因重力作用掉到下方圆盘的孔里)。

算法标签:枚举、排序

题解:

这道题和最长上升子序列有点像。先按照 \(b_i\) 降序对圆环排序,方便转移。

设 \(\text{dp}_i\) 为以 \(i\) 为顶的最大塔高,则有转移:

\[\text{dp}_i=\text{max}\{\text{dp}_j+h_i\} (j < i, b_i > a_j)
\]

。于是你 T 了。

因此考虑引入堆优化。将先前的状态压入大根堆中(按 \(h\) 排序),直接弹出 \(a \ge b_i\) 的栈顶(因为此时堆顶不合法,接下来堆顶一定更不合法),直到合法,然后更新答案即可。

时间复杂度 \(O(n\text{log}{n})\),可以通过。

#include <bits/stdc++.h>
using namespace std;
#define int long long
struct dat {
int a, b, h;
} ring[100010];
int n, dp[100010];
bool cmp(dat a, dat b) {
if (a.b != b.b) return a.b > b.b;
return a.a > b.a;
}
bool operator < (dat x, dat y) { return x.h < y.h; }
priority_queue<dat> q;
signed main() {
scanf("%lld", &n);
for (int i = 1; i <= n; i++) {
scanf("%lld%lld%lld", &ring[i].a, &ring[i].b, &ring[i].h);
}
sort(ring + 1, ring + n + 1, cmp);
q.push({0, 0, 0});
long long ans = 0;
for (int i = 1; i <= n; i++) {
while (q.top().a >= ring[i].b) q.pop();
dp[i] = q.top().h + ring[i].h;
q.push({ring[i].a, ring[i].b, q.top().h + ring[i].h});
ans = max(ans, dp[i]);
}
printf("%lld\n", ans);
return 0;
}

总结

这套题在 Codeforces 中属于较简单水平,有希望考场 AK(只是有希望)。

Codeforces 777 题目研讨的更多相关文章

  1. BUPT2017 springtraining(16) #1 ——近期codeforces简单题目回顾

    这里是contest 8道题全部来源于 cf 的两场contest (出题人可真懒啊 Codeforces Round #411 (Div. 2)的ABCDE Codeforces Round #40 ...

  2. Codeforces 划水

    Codeforces 566F 题目大意:给定$N$个数,任意两个数之间若存在一个数为另一个数的因数,那么这两个数存在边,求图中最大团. 分析:求一个图最大团为NP-Hard问题,一般不采用硬方法算. ...

  3. Codeforces Round# 305 (Div 1)

    [Codeforces 547A] #include <bits/stdc++.h> #define maxn 1000010 using namespace std; typedef l ...

  4. codeforces 577

    codeforces 577A 题目链接:http://codeforces.com/problemset/problem/577/A 题目大意:给出一个n*n的表格,每个表格对应的值为横坐标*纵坐标 ...

  5. Codeforces Round #144 (Div. 2) D table

    CodeForces - 233D 题目大意给你一个n*m 的矩阵,要求你进行涂色,保证每个n*n的矩阵内都有k个点被涂色. 问你一共有多少种涂色方案. n<=100 && m& ...

  6. Codeforces 675E Trains and Statistic - 线段树 - 动态规划

    题目传送门 快速的vjudge通道 快速的Codeforces通道 题目大意 有$n$个火车站,第$i$个火车站出售第$i + 1$到第$a_{i}$个火车站的车票,特殊地,第$n$个火车站不出售车票 ...

  7. Consecutive Subsequence CodeForces - 977F(dp)

    Consecutive Subsequence CodeForces - 977F 题目大意:输出一序列中的最大的连续数列的长度和与其对应的下标(连续是指 7 8 9这样的数列) 解题思路: 状态:把 ...

  8. codeforces Round#429 (Div2)

    2017-08-20 10:00:37 writer:pprp 用头文件#include <bits/stdc++.h>很方便 A. Generous Kefa codeforces 84 ...

  9. Codeforces 474D Flowers 动态规划法

    话说好久没写算法代码了,工作了有点忙的了.只是算法始终是我的挚爱,故此还是尽量抽时间和挚爱来个约会. Codeforces的题目是最适合练手的了,以下是一道不算难的动态规划法题目.先上题: D. Fl ...

  10. CodeForces - 906D Power Tower(欧拉降幂定理)

    Power Tower CodeForces - 906D 题目大意:有N个数字,然后给你q个区间,要你求每一个区间中所有的数字从左到右依次垒起来的次方的幂对m取模之后的数字是多少. 用到一个新知识, ...

随机推荐

  1. 瑞芯微 | 如何固定以太口地址为指定ip?ifplugd妙用

    rxw的RK3568的evb1公板,有2个以太口, 默认UI界面只能配置eth0,无法配置eth1, 实际应用中,有时需要一旦有网线插入,就需要该地址设置为指定IP地址. 本文介绍2个最简单的方法实现 ...

  2. Win32_GDI_五星红旗绘制

    五星红旗画法 设置矩形长与高的比为3:2 把矩形分为四个相等的长方形 把左上角宽分为15份,高分为10份 定位大五角星圆心位置,x为宽的5份,y为高的5份 计算五角星五个点的坐标 void SetFi ...

  3. RabbitMQ接口封装

    1.引用 <dependency> <groupId>com.rabbitmq</groupId> <artifactId>amqp-client< ...

  4. python的dir()函数

    dir()函数不带参数时,返回当前范围内的变量.方法和定义的类型列表:

  5. Python wheel

    在 Python 的生态系统中,wheel 是一种打包格式,用于分发和安装 Python 项目.它是 Python 包的标准格式之一,旨在提高安装速度和可靠性. Wheel 的优势 快速安装:因为 w ...

  6. Maven 设置 JDK 版本

    Maven 设置 JDK 版本是通过 Apache Maven Compiler Plugin 插件实现的.它用于编译项目的源代码. 方法一 有时候你可能需要将某个项目编译到与当前使用的 JDK 版本 ...

  7. Docker 发布镜像

    发布镜像 在 Docker Hub 发布镜像 登陆到 Docker Hub docker login 标记镜像并推送到 Docker Hub docker tag <image>:< ...

  8. 工作 6 年,@Transactional 注解用的一塌糊涂

    接手新项目一言难尽,别的不说单单就一个 @Transactional 注解用的一塌糊涂,五花八门的用法,很大部分还失效无法回滚. 有意识的在涉及事务相关方法上加@Transactional注解,是个好 ...

  9. Servlet——执行流程、生命周期、方法介绍、体系结构

    执行流程    生命周期 对象的生命周期是指一个对象从被创建到被销毁的整个过程 Servlet运行在Servlet容器(web服务器)中,其生命周期由容器管理,分为四个阶段:     1. 加载和实例 ...

  10. 基于Keras-YOLO实现目标检测

    Keras-YOLO 3项目使用Python语言实现了YOLO v3网络模型,并且可以导入Darknet网络预先训练好的权重文件信息直接使用网络进行目标识别. 1. 下载Keras-YOLO 3项目 ...