NC20439 [SHOI2017]期末考试
NC20439 [SHOI2017]期末考试
题目
题目描述
有 \(n\) 位同学,每位同学都参加了全部的 \(m\) 门课程的期末考试,都在焦急的等待成绩的公布。第 \(i\) 位同学希望在第 \(t_i\) 天或之前得知所有课程的成绩。如果在第ti天,有至少一门课程的成绩没有公布,他就会等待最后公布成绩的课程公布成绩,每等待一天就会产生 \(C\) 不愉快度。对于第 \(i\) 门课程,按照原本的计划,会在第 \(b_i\) 天公布成绩。有如下两种操作可以调整公布成绩的时间:
1.将负责课程 \(X\) 的部分老师调整到课程 \(Y\) ,调整之后公布课程 \(X\) 成绩的时间推迟一天,公布课程 \(Y\) 成绩的时间提前一天;每次操作产生 \(A\) 不愉快度。
2.增加一部分老师负责学科 \(Z\) ,这将导致学科 \(Z\) 的出成绩时间提前一天;每次操作产生 \(B\) 不愉快度。
上面两种操作中的参数 \(X,Y,Z\) 均可任意指定,每种操作均可以执行多次,每次执行时都可以重新指定参数。
现在希望你通过合理的操作,使得最后总的不愉快度之和最小,输出最小的不愉快度之和即可
输入描述
第一行三个非负整数 \(A,B,C\) ,描述三种不愉快度,详见【问题描述】;
第二行两个正整数 \(n,m(1 ≤ n,m ≤ 10^5)\) , 分别表示学生的数量和课程的数量;
第三行 \(n\) 个正整数 \(t_i\) ,表示每个学生希望的公布成绩的时间;
第四行 \(m\) 个正整数 \(b_i\) ,表示按照原本的计划,每门课程公布成绩的时间。
\(1 ≤ N,M,T_i,B_i ≤ 100000,0 ≤ A,B,C ≤ 100000\)
输出描述
输出一行一个整数,表示最小的不愉快度之和。
示例1
输入
100 100 2
4 5
5 1 2 3
1 1 2 3 3
输出
6
说明
由于调整操作产生的不愉快度太大,所以在本例中最好的方案是不进行调整; 全部
5 的门课程中,最慢的在第 3 天出成绩;
同学 1 希望在第 5 天或之前出成绩,所以不会产生不愉快度;
同学 2 希望在第 1 天或之前出成绩,产生的不愉快度为 (3 - 1) * 2 = 4;
同学 3 希望在第 2 天或之前出成绩,产生的不愉快度为 (3 - 2) * 2 = 2;
同学 4 希望在第 3 天或之前出成绩,所以不会产生不愉快度;
不愉快度之和为 4 + 2 = 6 。
备注
数据范围
题解
思路
知识点:三分。
三分最晚的公布的时间,因为其符合单调性,晚于或早于这个时间的最晚公布时间造成的不满意度都会变大,B则答案时间在峰谷。
通过计算最晚时间 \(mid\) 的最优不满意度进行检验答案。先遍历数组计算超时总额 \(need\) 和多余总额 \(rest\) ,\(rest\) 用于操作 \(1\) 。注意到,若 \(A\geq B\) 肯定优先用操作 \(2\) 提前所有超时课的公布时间,花费是 \(B \cdot need\) ;若 \(A<B\) ,优先用操作 \(1\) ,但可能 \(rest\) 不够,需要用操作 \(2\) 补齐剩余的 \(need\) ,够用的花费是 \(A \cdot need\) ,不够用的花费是 \(A \cdot rest + B \cdot (need - rest)\) 。最后累加 \(C\cdot max(mid-T[i])\) ,得到调整后的学生不满意度,返回花费总和进行比较。
时间复杂度 \(O((m+n)\log B_{max})\)
空间复杂度 \(O(m+n)\)
代码
#include <bits/stdc++.h>
#define ll long long
using namespace std;
ll a, b, c;
int n, m;
int T[100007], B[100007];
ll calc(int mid) {
ll need = 0, rest = 0, ans = 0;
for (int i = 0;i < m;i++) {
if (B[i] <= mid) rest += mid - B[i];
else need += B[i] - mid;
}
if (b <= a) ans += need * b;
else {
if (need <= rest) ans += need * a;
else ans += rest * a + (need - rest) * b;
}
for (int i = 0;i < n;i++) ans += max(mid - T[i], 0) * c;
return ans;
}
int main() {
std::ios::sync_with_stdio(0), cin.tie(0), cout.tie(0);
cin >> a >> b >> c >> n >> m;
for (int i = 0;i < n;i++) cin >> T[i];
for (int i = 0;i < m;i++) cin >> B[i];
int l = 1, r = *max_element(B, B + m);
while (l <= r) {
int mid1 = l + (r - l) / 3;
int mid2 = r - (r - l) / 3;
if (calc(mid1) <= calc(mid2)) r = mid2 - 1;
else l = mid1 + 1;
}
cout << calc(l) << '\n';
return 0;
}
NC20439 [SHOI2017]期末考试的更多相关文章
- bzoj4868: [Shoi2017]期末考试(三分法)
4868: [Shoi2017]期末考试 题目:传送门 题解: Get到一个新姿势...三分法 一开始百度百科的时候下了一跳...中国...的根??? 学懂了之后其实运用起来就根二分差不多啊,不过证明 ...
- bzoj 4868: [Shoi2017]期末考试
Description 有n位同学,每位同学都参加了全部的m门课程的期末考试,都在焦急的等待成绩的公布.第i位同学希望在第ti天 或之前得知所.有.课程的成绩.如果在第ti天,有至少一门课程的成绩没有 ...
- [bzoj4868][Shoi2017]期末考试
来自FallDream 的博客,未经允许,请勿转载,谢谢. 有n位同学,每位同学都参加了全部的m门课程的期末考试,都在焦急的等待成绩的公布.第i位同学希望在第ti天或之前得知所.有.课程的成绩.如果在 ...
- BZOJ4868:[SHOI2017]期末考试——题解
http://www.lydsy.com/JudgeOnline/problem.php?id=4868 题目复制于洛谷:https://www.luogu.org/problemnew/show/P ...
- [SHOI2017]期末考试
题目描述 有n位同学,每位同学都参加了全部的m门课程的期末考试,都在焦急的等待成绩的公布. 第i位同学希望在第ti天或之前得知所有课程的成绩.如果在第ti天,有至少一门课程的成绩没有公布,他就会等待最 ...
- 【bzoj4868】[Shoi2017]期末考试 前缀和+暴力
题目描述 有n位同学,每位同学都参加了全部的m门课程的期末考试,都在焦急的等待成绩的公布.第i位同学希望在第ti天或之前得知所.有.课程的成绩.如果在第ti天,有至少一门课程的成绩没有公布,他就会等待 ...
- BZOJ-1- 4868: [Shoi2017]期末考试-三分
三分出成绩时间,假设当前出成绩最优,那么提前就会调增老师,增加不愉快度多于少等待的:如果延迟时间. 那么等待更久,增加的不愉快度也将多余少调增剩省下的. 于是:对于当前点,两边都是有单调性的. 就是说 ...
- BZOJ4868 [Shoi2017]期末考试 【三分 + 贪心】
题目链接 BZOJ4868 题解 最后的答案决定于最后一个公布的成绩 显然这个是答案关于这个时间点是呈凸单调的 三分一下这个时间点 时间点固定,在这个时间前的人都会产生不愉快度,在这个时间前的科目可以 ...
- BZOJ4868 Shoi2017期末考试(三分+贪心)
容易想到枚举最晚发布成绩的课哪天发布,这样与ti和C有关的贡献固定.每门课要么贡献一些调节次数,要么需要一些调节次数,剩下的算贡献也非常显然.这样就能做到平方级别了. 然后大胆猜想这是一个凸函数三分就 ...
随机推荐
- Python抽象基类:ABC谢谢你,因为有你,温暖了四季!
Python抽象基类:ABC谢谢你,因为有你,温暖了四季! Python抽象基类:ABC谢谢你,因为有你,温暖了四季! 实例方法.类方法和静态方法 抽象类 具名元组 参考资料 最近阅读了<Pyt ...
- HCNP Routing&Switching之代理ARP
前文我们了解了端口隔离相关话题,回顾请参考https://www.cnblogs.com/qiuhom-1874/p/16186451.html:今天我们来聊一聊ARP代理相关话题: 端口隔离之破解之 ...
- Cesium DrawCommand [1] 不谈地球 画个三角形
目录 0. 前言 0.1. 源码中的 DrawCommand 1. 创建 1.1. 构成要素 - VertexArray 1.2. 构成要素 - ShaderProgram 1.3. 构成要素 - W ...
- AsyncLocal<T>在链路追踪中的应用
前言 在项目生产中日志的记录是必不可少的,在.net项目中,要说日志组件,log4net绝对可有一席之地,随着公司业务的发展,微服务则必定无可避免.在跨服务中通过日志进行分析性能或者排查故障点,如何快 ...
- Keepalived入门学习
一个执着于技术的公众号 Keepalived简介 Keepalived 是使用C语言编写的路由热备软件,该项目软件起初是专门为LVS负载均衡设计的,用来管理并监控LVS集群系统中各个服务节点的状态,后 ...
- APP应用前端开发
1.开发手机APP前端要重视meta标签的编写: 2.注意HTML5标签在前端开发中的使用: 3.前端制作要舍弃CSS float属性(可flex布局),用绝对定位不利于页面布局的扩展: 4.APP前 ...
- 过早的给方法中 引用对象 设为 null 可被 GC提前回收吗?
经常在代码中看到有人将 null 赋值给引用类型,来达到让 GC 提前回收的目的,这样做真的有用吗?今天我们就来研究一下. 为了方便讲解,来一段测试代码,提前将 test1=null ,然后调用 GC ...
- DDoS攻击--Syn_Flood攻击防护详解(TCP)
https://blog.csdn.net/qq_34777600/article/details/81946514
- 从rocketmq入手,解析各种零拷贝的jvm层原理
在上一篇文章中,主要介绍了rocketmq消息的存储流程.其主要使用了mmap的零拷贝技术实现了硬盘和内存的映射,从而提高了读写性能.在流程中有一个非常有意思的预热方法并没有详细分析,因为其中涉及到了 ...
- 虚拟机:ESX
VMware ESXi 与ESX 产品之比较 VMware vSphere 5.0 以后版本,所有底层虚拟化产品都改为ESXi产品,本文主要比较了ESXi与ESX的各自特点,以便对大家是否要把现有 ...