题解:洛谷P3745 期末考试(整数三分)

题目传送门

题目大意:给出 \(n\) 个同学期望出成绩的时间限制 \(a_i\) 和 \(m\) 个学科公布成绩的初始时间 \(t_i\) ,1个同学每多等一天就产生 C 的不愉快度。问通过一番操作后最小的不愉快度之和是多少?

操作有两种:

1.让学科 X 的发布时间晚1天,学科 Y 的发布时间早1天,产生A的不愉快度。

2.让学科 Z 的发布时间早1天,产生 B 的不愉快度。

思路:

设 \(t\) 表示规定的所有学科公布成绩的时间期限,\(y\) 表示满足第 \(t\) 天时出所有成绩的最小不愉快度之和。

则 \(y\) 关于 \(t\) 的函数是一个下凹函数(或者说形状类似一个开口向上的抛物线吧)

考虑三分出最低点(三分的部分就是板子了)

考虑怎么算 \(y\) ,由两部分组成:(1)\(t_i<t\) 的所有同学的不愉快度 \(res\)(2)操作的不愉快度

操作的不愉快度有两种,一种是 A 的移大补小,一种是 B 的暴力删。

首先明确一点:不关心大的到底补到了哪个小的,小的最终具体时间也不关心,因为同学的不愉快度只跟上限 \(t\) 有关。下面对操作的不愉快度进行分讨:

(1)若 \(B \leq A\) , 那肯定只使用 B

(2)若 \(A < B\) , 记所有小于 t 的学科的时间可以提供的补过来的空缺为 val1 , 大于 t 的学科超过 t 的总时间为 val2

当 \(val1 \geq val2\),全用 A 操作

当 \(val1 < val2\),进行 val1 次 A 操作,再进行 (val2-val1)次 B 操作

注意三分的边界和退出条件,算 \(res,val1,val2\) 时可以 \(O(N)\) 遍历 \(a_i\) 和 \(t_i\) ,也可以先排序后记个前缀和,三分的时候二分查找一下 分界点 \(t\) 再两个数组中的位置,时间复杂度 \(O(log_3N*log_2N)\)(感觉有点抽象,具体细节看代码吧~),注意特判C很大的情况,不然要开unsigned long long。

#include<bits/stdc++.h>
using namespace std;
#define ll long long
#define F(i,l,r) for(int i=l;i<=r;++i)
const int N=1e5+5;
const ll M=1e16;
int n,m,A,B,a[N],t[N];
ll C,s1[N],s2[N];
inline ll suan(int x){//限制所有学科天数不超过x
ll w1=upper_bound(t+1,t+m+1,x)-t-1,w2=lower_bound(a+1,a+n+1,x)-a-1,
val1=x*w1-s2[w1],val2=(s2[m]-s2[w1])-(m-w1)*x,
res=(w2*x-s1[w2])*C;
//val1:<x的w1天里有多少空缺
//val2:超过x天的学科里要移动多少天过来(或者说理论上要多少空缺)
if(A<B){
if(val1>=val2) return A*val2+res;
else return A*val1+B*(val2-val1)+res;
}
return val2*B+res;
}
int main(){
scanf("%d%d%lld%d%d",&A,&B,&C,&n,&m);
F(i,1,n) scanf("%d",&a[i]); sort(a+1,a+n+1); F(i,1,n) s1[i]=s1[i-1]+a[i];
F(i,1,m) scanf("%d",&t[i]); sort(t+1,t+m+1); F(i,1,m) s2[i]=s2[i-1]+t[i];
if(C==1e16) return printf("%lld",suan(a[1])),0;//特判C很大的情况,不然要开unsigned long long
int l=0,r=t[m]+1,mid1,mid2;
while(l+2<r){
mid1=(2*l+r)/3,mid2=(l+2*r)/3;
if(suan(mid1)>=suan(mid2)) l=mid1;
else r=mid2;
}
printf("%lld",min({suan(l),suan(r),suan(l+1)}));
return 0;
}

题解:洛谷P3745 期末考试(整数三分)的更多相关文章

  1. 【Luogu】P3745期末考试(三分)

    题目链接 我是怎么把“期末考试”在本地写成“假期计划”的 qwq???? 本题把学生和卷子都排个序,按出成绩最晚时间三分. 三分之后可以O(n)的时间统计答案,因为修改卷子出成绩的时间可以贪心计划. ...

  2. 【题解】期末考试 六省联考 2017 洛谷 P3745 BZOJ 4868 贪心 三分

    题目传送门:这里是萌萌哒传送门(>,<) 啊♀,据说这题有个完全贪心的做法,但是要维护太多东西好麻烦的(>,<),于是就来口胡一发三分的做法. 思路很简单,假设我指定了一个x, ...

  3. 题解 洛谷P3745 【[六省联考2017]期末考试】

    这题有点绕,我写了\(2h\)终于搞明白了. 主要思路:枚举最晚公布成绩的时间\(maxt\),然后将所有公布时间大于\(maxt\)的课程都严格降为\(maxt\)即可. 在此之前,还要搞清楚一个概 ...

  4. 洛谷模拟NOIP考试反思

    洛谷模拟NOIP考试反思 想法 考了这么简单的试qwq然而依然emmmmmm成绩不好 虽然本次难度应该是大于正常PJ难度的但还是很不理想,离预估分数差很多qwq 于是就有了本反思嘤嘤嘤 比赛链接 原比 ...

  5. 洛谷 P3745 [六省联考2017]期末考试

    题目描述 有 nnn 位同学,每位同学都参加了全部的 mmm 门课程的期末考试,都在焦急的等待成绩的公布. 第 iii 位同学希望在第 tit_iti​ 天或之前得知所有课程的成绩.如果在第 tit_ ...

  6. 洛谷P3745 [六省联考2017]期末考试

    传送门 题解 //Achen #include<algorithm> #include<iostream> #include<cstring> #include&l ...

  7. 题解 洛谷P5018【对称二叉树】(noip2018T4)

    \(noip2018\) \(T4\)题解 其实呢,我是觉得这题比\(T3\)水到不知道哪里去了 毕竟我比较菜,不大会\(dp\) 好了开始讲正事 这题其实考察的其实就是选手对D(大)F(法)S(师) ...

  8. 题解 洛谷 P3396 【哈希冲突】(根号分治)

    根号分治 前言 本题是一道讲解根号分治思想的论文题(然鹅我并没有找到论文),正 如论文中所说,根号算法--不仅是分块,根号分治利用的思想和分块像 似却又不同,某一篇洛谷日报中说过,分块算法实质上是一种 ...

  9. 题解-洛谷P5410 【模板】扩展 KMP(Z 函数)

    题面 洛谷P5410 [模板]扩展 KMP(Z 函数) 给定两个字符串 \(a,b\),要求出两个数组:\(b\) 的 \(z\) 函数数组 \(z\).\(b\) 与 \(a\) 的每一个后缀的 L ...

  10. 题解-洛谷P4229 某位歌姬的故事

    题面 洛谷P4229 某位歌姬的故事 \(T\) 组测试数据.有 \(n\) 个音节,每个音节 \(h_i\in[1,A]\),还有 \(m\) 个限制 \((l_i,r_i,g_i)\) 表示 \( ...

随机推荐

  1. 微服务全链路跟踪:grpc集成zipkin

    微服务全链路跟踪:grpc集成zipkin 微服务全链路跟踪:grpc集成jaeger 微服务全链路跟踪:springcloud集成jaeger 微服务全链路跟踪:jaeger集成istio,并兼容u ...

  2. 别再被坑了! JavaScript类型检测的最佳实践

    别再被坑了! JavaScript类型检测的最佳实践 在 JavaScript 中,我们经常需要判断一个变量的类型.这个需求在编程中非常常见,因为不同类型的数据会影响到我们的代码逻辑. JavaScr ...

  3. Linux下SPI驱动详解

    更多嵌入式原创文章,请关注公众号:一口Linux 1. SPI总线 1.1. SPI总线概述 SPI,是英语Serial Peripheral interface的缩写,顾名思义就是串行外围设备接口. ...

  4. 23. 基于Cortex-A9 uboot代码启动分析

    本篇文章是彭老师第一次在B站直播间,边直播边记录笔记,视频已经上传到B站. 现在完善整理成该篇文章,有想学习uboot启动的代码详细流程的老铁可以进入我B站空间配合视频一起学习. [视频地址] B站用 ...

  5. zabbix功能应用

    一.zabbix简介 1.zabbix概述 zabbix:是一个基于WEB界面的提供分布式系统监视以及网络监视功能的企业级的开源解决方案,能够监视各种网络参数,保证服务器系统的安全运营:并提供灵活的通 ...

  6. Python if __name__ == "__main__" 解释

    一种机制,允许脚本以不同的方式运行,这取决于作为独立的程序执行还是作为模块被其他脚本导入.这种机制就是 if __name == "__main__" 其作用是控制某些代码块只在该 ...

  7. Python新手爬虫一:爬取影片名称评分等

    豆瓣网站:https://movie.douban.com/chart 先上最后的代码: from bs4 import BeautifulSoup from lxml import html imp ...

  8. JavaScript – Web Worker

    前言 在上一篇 << 单线程 与 执行机制 >> 中, 我们提到了 Web Worker. 它的诞生是为了解决 JS 主线程执行耗时计算时, 导致 UI 无法及时更新的卡死现象 ...

  9. Tomcat——配置、部署

    配置 修改启动端口号:conf/sever.xml          HTTP协议默认端口号为80,若将Tomcat端口号改为80,则将来访问Tomcat时,不用输入端口号          端口号改 ...

  10. BOOST <boost/asio.hpp> 奇怪的编译错误 boost/asio/detail/consuming_buffers.hpp:105:65: error

    在我的项目工程代码内#include <boost/asio.hpp>后导致了编译报错: ./include/boost/asio/detail/consuming_buffers.hpp ...