[AC 代码] Unfair contest-程序员宅基地

技术标签: 算法  题解  acm竞赛  

题目来源

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 的情况分好就比较简单了。

代码注释里有详细的分析,这里就不废话了。

AC 代码

#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();
    }    
}

PS

这里我存放 AC 代码的仓库,欢迎来玩;)

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/jax_yang/article/details/119775406

智能推荐

JVM G1源码分析——引用_jvmg1源码分析和调优-程序员宅基地

文章浏览阅读104次。我们这里所说的引用主要指:软引用、弱引用和虚引用。另外值得一提的是Java中的Finalize也是通过引用实现的,JDK定义了一种新的引用类型FinalReference,这个类型的处理和其他三种引用都稍有不同。另外在非公开的JDK包中还有一个sun.misc.cleaner,通常用它来释放非堆内存资源,它在JVM内部也是用一个CleanerReference实现。要理解引用处理需要先从Java代码入手。// Reference指向的对象。_jvmg1源码分析和调优

php中轮转图片js代码,纯JavaScript手写图片轮播代码-程序员宅基地

文章浏览阅读103次。废话不多说了,直接给大家贴js代码实现手写图片轮播的代码了,代码非常简单,具体代码如下所示:js图片轮播切换.imgCon{width: 400px;height: 400px;border: 2px solid #DCDCDC;margin: 100px auto;position: relative;}.imgCon span{display: block;position: absolute..._手写转图片js脚本

【计算机毕业设计选题】20套精品毕设项目分享(源码+论文)Java 前后端分离_csdn计算机学生毕设-程序员宅基地

文章浏览阅读2.2k次。毕设 计算机 springboot ssm java python 毕业设计 _csdn计算机学生毕设

Kafka消息中间件(一)_kafka 9095-程序员宅基地

文章浏览阅读1.5w次,点赞7次,收藏34次。Kafka消息中间件Kafka消息组件简介 Kafka可以说是现在所有开源消息组件之中性能最高的产品,但是同时也需要认识到一个问题:Kafka是一项不断继续发展的技术,所以来说对于其的稳定性永远无法评估。Kafka官网地址: http://kafka.apache.org/Kafka是分布式发布-订阅消息系统(主题)。它最初由LinkedIn公司开发,之后成为Apache项目的一部..._kafka 9095

C++ Qt开发:TableWidget表格组件_tabelwidget-程序员宅基地

文章浏览阅读5.1k次,点赞34次,收藏31次。`QTableWidget` 是 Qt 中用于显示表格数据的部件。它是 `QTableView` 的子类,提供了一个简单的接口,适用于一些不需要使用自定义数据模型的简单表格场景。该组件可以看作是`TreeWidget`树形组件的高级版,表格组件相比于树结构组件灵活性更高,不仅提供了输出展示二维表格功能,还可以直接对表格元素直接进行编辑与修改操作,表格结构分为表头,表中数据两部分,表格结构可看作一个二维数组,通过数组行列即可锁定特定元素。_tabelwidget

Incorrect string value: '\\xF0\\x9F\\x93\\x9E 1...' for column 'nickname' at row 1" 报错解决办法_: lncorrect string value: "xfox9f8dx93xe9x9...-程序员宅基地

文章浏览阅读1.1w次,点赞2次,收藏6次。遇到这种问题,是由于特殊字符占用4个字节,mysql默认的编码方式是utf8,只支持3个字节的。所以需要更改数据表的编码方式为utf8mb4。查看mysql的编码show variables like '%character%';结果如下:修改表的字符集:语法:alter table 表名 convert to character set 字符集;把需要修改..._: lncorrect string value: "xfox9f8dx93xe9x9...

随便推点

Python构建快速高效的中文文字识别OCR_中文ocr python-程序员宅基地

文章浏览阅读4.5w次,点赞32次,收藏255次。Windows操作系统,使用开源项目chineseocr_lite,超详细到每一步编译过程,OCR识别效果非常好_中文ocr python

SQL语句用case when实现if-else条件逻辑_case when里面可以加if else吗-程序员宅基地

文章浏览阅读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吗

数据结构实验课程设计报告求工程的最短完成时间_(1)用字符文件提供数据建立aoe网络邻接表存储结构; (2)编写程序,实现图中顶点的-程序员宅基地

文章浏览阅读1k次,点赞4次,收藏9次。实验目的:掌握图的存储结构;掌握图的拓扑排序算法以及AOE网络顶点最早开始时间的计算方法。用字符文件提供数据建立AOE网络的存储结构。编写程序,计算并输出工程的最短完成时间。1.课程设计内容与要求。_(1)用字符文件提供数据建立aoe网络邻接表存储结构; (2)编写程序,实现图中顶点的

UAC绕过提权_uac白名单 提权-程序员宅基地

文章浏览阅读106次。UAC绕过提权_uac白名单 提权

Linux一键部署OpenVPN脚本-程序员宅基地

文章浏览阅读664次,点赞7次,收藏12次。每次架设OpenVPN Server就很痛苦,步骤太多,会出错的地方也多,基本很少一次性成功的。

头文件的相互包含问题_多个头文件相互包含-程序员宅基地

文章浏览阅读397次。 今天看了继承以及派生类,并且运行了教程中的一个实例,但是仍然有好多坑。主要如下:建立了一个基类bClass以及由基类bClass派生的一个dClass,并且建立两个头文件.h分别申明这两个类,在cpp程序中进行运行来检验。具体程序如下:#ifndef ITEM_BASE//为避免类重复定义,需要在头文件的开头和结尾加上如这个所示 #define ITEM_BASEclass bClass..._多个头文件相互包含