2021“MINIEYE杯”中国大学生算法设计超级联赛(9)
先从 n - 1 各得分中删去 s 个最高分,t 个 最低分,然后再根据第 n 个得分加上对应的分数,然后再根据 A,B 得分分情况讨论。
需要注意的是特殊情况的处理,也就是 a n a_n an 取 1 1 1 和 b n b_n bn 取 h h h 的情况分好就比较简单了。
代码注释里有详细的分析,这里就不废话了。
#include <bits/stdc++.h>
using namespace std;
using ll = long long;
const char el = '\n';
const int N = 1e5 + 10;
int a[N], b[N];
void solve() {
int n, s, t, h;
cin >> n >> s >> t >> h;
for (int i = 1; i < n; ++i) cin >> a[i];
for (int i = 1; i < n; ++i) cin >> b[i];
// 添加冗余,处理 s = 0 或 t = 0 的情况
a[0] = b[0] = 1;
a[n] = b[n] = h;
sort(a + 1, a + n);
sort(b + 1, b + n);
// 先计算删除 s 个最大值和 t 各最小值的得分
ll sum_a = accumulate(a + t + 1, a + n - s, 0ll);
ll sum_b = accumulate(b + t + 1, b + n - s, 0ll);
// 因为还有一个分每算,所以可以加上两边的边界值得到最终得分的范围
ll min_a = sum_a + a[t], max_a = sum_a + a[n - s];
ll min_b = sum_b + b[t], max_b = sum_b + b[n - s];
if (max_a <= min_b) {
cout << "IMPOSSIBLE" << el;
return;
}
ll ans;
if (min_a > max_b) {
ans = 1 - h;
} else if (max_a > max_b) {
// 此时 min_a <= max_b
// 此时 val_a 不能取 min_a,也就是 a_n 不能取 1 了,所以 a_n 只能尽量取小
// 假设 b_n 也没超过 b[n - s],也就是 val_b <= max_b
// val_a 可以取 val_b + 1,从而 a_n = val_b + 1 - sum_a
// 所以 ans = a_n - b_n = val_b + 1 - sum_a - b_n = 1 - sum_a + (val_b - b_n) = 1 - sum_a + sum_b
// 观察到如果 b_n <= b[n - s],ans 是个常量,如果让 b_n 大于 b[n - s],
// 那么 val_a = max_b + 1 -> a_n = max_b + 1 - sum_a
// ans = max_b + 1 - sum_a - b_n = 1 - sum_a + (sum_b + b[n -s] - b_n)
// 所以应该取 b_n 为 h,a_n 尽量小,使得 val_n 刚好大于 max_b
ans = max_b + 1 - sum_a - h;
if (min_a > min_b) {
// a_n 可以取 1
// 注意特判,这种情况的答案可能比上面的 b_n 取 h 还小
ll val_b = min_a - 1;
ll b_n = val_b - sum_b;
ans = min(ans, 1 - b_n);
}
} else if (min_a > min_b) {
// 这里只有着一种特殊情况,所以无需特判
ll b_n = min_a - 1 - sum_b;
ans = 1 - b_n;
} else {
// 此时 min_a <= max_a <= max_b,所以 b_n 不能取 h
// min_a <= min_b,所以 a_n 不能取 1
// 这就是最一般的情况
// val_a = sum_a + a_n, val_b = val_a - 1 = sum_b + b_n
// a_n = val_a - sum_a, b_n = val_a - 1 - sum_b
// ans = val_a - sum_a - val_a + 1 + sum_b = 1 - sum_a + sum_b
ans = 1 - sum_a + sum_b;
}
cout << ans << endl;
}
int main() {
ios::sync_with_stdio(false);
cin.tie(nullptr);
int t;
cin >> t;
while (t--) {
solve();
}
}
这里我存放 AC 代码的仓库,欢迎来玩;)
文章浏览阅读104次。我们这里所说的引用主要指:软引用、弱引用和虚引用。另外值得一提的是Java中的Finalize也是通过引用实现的,JDK定义了一种新的引用类型FinalReference,这个类型的处理和其他三种引用都稍有不同。另外在非公开的JDK包中还有一个sun.misc.cleaner,通常用它来释放非堆内存资源,它在JVM内部也是用一个CleanerReference实现。要理解引用处理需要先从Java代码入手。// Reference指向的对象。_jvmg1源码分析和调优
文章浏览阅读103次。废话不多说了,直接给大家贴js代码实现手写图片轮播的代码了,代码非常简单,具体代码如下所示:js图片轮播切换.imgCon{width: 400px;height: 400px;border: 2px solid #DCDCDC;margin: 100px auto;position: relative;}.imgCon span{display: block;position: absolute..._手写转图片js脚本
文章浏览阅读2.2k次。毕设 计算机 springboot ssm java python 毕业设计 _csdn计算机学生毕设
文章浏览阅读1.5w次,点赞7次,收藏34次。Kafka消息中间件Kafka消息组件简介 Kafka可以说是现在所有开源消息组件之中性能最高的产品,但是同时也需要认识到一个问题:Kafka是一项不断继续发展的技术,所以来说对于其的稳定性永远无法评估。Kafka官网地址: http://kafka.apache.org/Kafka是分布式发布-订阅消息系统(主题)。它最初由LinkedIn公司开发,之后成为Apache项目的一部..._kafka 9095
文章浏览阅读5.1k次,点赞34次,收藏31次。`QTableWidget` 是 Qt 中用于显示表格数据的部件。它是 `QTableView` 的子类,提供了一个简单的接口,适用于一些不需要使用自定义数据模型的简单表格场景。该组件可以看作是`TreeWidget`树形组件的高级版,表格组件相比于树结构组件灵活性更高,不仅提供了输出展示二维表格功能,还可以直接对表格元素直接进行编辑与修改操作,表格结构分为表头,表中数据两部分,表格结构可看作一个二维数组,通过数组行列即可锁定特定元素。_tabelwidget
文章浏览阅读1.1w次,点赞2次,收藏6次。遇到这种问题,是由于特殊字符占用4个字节,mysql默认的编码方式是utf8,只支持3个字节的。所以需要更改数据表的编码方式为utf8mb4。查看mysql的编码show variables like '%character%';结果如下:修改表的字符集:语法:alter table 表名 convert to character set 字符集;把需要修改..._: lncorrect string value: "xfox9f8dx93xe9x9...
文章浏览阅读4.5w次,点赞32次,收藏255次。Windows操作系统,使用开源项目chineseocr_lite,超详细到每一步编译过程,OCR识别效果非常好_中文ocr python
文章浏览阅读2.3k次。SQL语句用case when实现if-else条件逻辑(一)查询select date, case when RIGHT(date,2) IN (01,02,03) then ‘Q1’ ELSE ‘Q2’end as mark --赋值列名为markfrom TEST --表名(二)更新新增列:alter teble TEST add mark nvarchar(100)为新增列赋值:update TEST set mark=(case when RIGHT(date,2) IN _case when里面可以加if else吗
文章浏览阅读1k次,点赞4次,收藏9次。实验目的:掌握图的存储结构;掌握图的拓扑排序算法以及AOE网络顶点最早开始时间的计算方法。用字符文件提供数据建立AOE网络的存储结构。编写程序,计算并输出工程的最短完成时间。1.课程设计内容与要求。_(1)用字符文件提供数据建立aoe网络邻接表存储结构; (2)编写程序,实现图中顶点的
文章浏览阅读106次。UAC绕过提权_uac白名单 提权
文章浏览阅读664次,点赞7次,收藏12次。每次架设OpenVPN Server就很痛苦,步骤太多,会出错的地方也多,基本很少一次性成功的。
文章浏览阅读397次。 今天看了继承以及派生类,并且运行了教程中的一个实例,但是仍然有好多坑。主要如下:建立了一个基类bClass以及由基类bClass派生的一个dClass,并且建立两个头文件.h分别申明这两个类,在cpp程序中进行运行来检验。具体程序如下:#ifndef ITEM_BASE//为避免类重复定义,需要在头文件的开头和结尾加上如这个所示 #define ITEM_BASEclass bClass..._多个头文件相互包含