http://www.lydsy.com/JudgeOnline/problem.php?id=4868

题目复制于洛谷:https://www.luogu.org/problemnew/show/P3745#sub

有n位同学,每位同学都参加了全部的m门课程的期末考试,都在焦急的等待成绩的公布。

第i位同学希望在第ti天或之前得知所有课程的成绩。如果在第ti天,有至少一门课程的成绩没有公布,他就会等待最后公布成绩的课程公布成绩,每等待一天就会产生C不愉快度。对于第i门课程,按照原本的计划,会在第bi天公布成绩。

有如下两种操作可以调整公布成绩的时间:

1.将负责课程X的部分老师调整到课程Y,调整之后公布课程X成绩的时间推迟一天,公布课程Y成绩的时间提前一天;每次操作产生A不愉快度。

2.增加一部分老师负责学科Z,这将导致学科Z的出成绩时间提前一天;每次操作产生B不愉快度。

上面两种操作中的参数X;Y;Z均可任意指定,每种操作均可以执行多次,每次执行时都可以重新指定参数。

现在希望你通过合理的操作,使得最后总的不愉快度之和最小,输出最小的不愉快度之和即可。

感觉像三分最终出成绩的时间但是不知道怎么证明于是看了题解。

首先我们考虑如果我们知道最终发成绩的时间的话,那么我们显然能得到此时的唯一最优解。

无脑做法:

显然学生代价C我们立刻能求出来,O(n)无脑。

然后我们考虑AB代价,显然B的操作要比A优秀,所以当B<=A时显然只需要B操作即可。

而且B操作代价求法很无脑,一个O(m)就能求。

考虑A操作,先预处理排好序然后无脑加减就可以做到一个O(m)。

所以综上固定时间求代价的复杂度为O(max(n,m)),且nm数量级一致,简记做O(n)。

再考虑对于学生来说,显然时间越小代价越小。

对于老师来说,显然时间越大代价越大。

复合函数显然满足单峰性,可以三分,是一个log的。

所以是O(nlogn),1e5绝对能过。

(我的代码就是这个)

跑得快做法:

http://www.cnblogs.com/RabbitHu/p/LOJ2141.html提供了一种O(n)求最优解的方法。

  1. #include<cstdio>
  2. #include<cctype>
  3. #include<algorithm>
  4. using namespace std;
  5. typedef long long ll;
  6. const int N=1e5+;
  7. inline int read(){
  8. int X=,w=;char ch=;
  9. while(!isdigit(ch)){w|=ch=='-';ch=getchar();}
  10. while(isdigit(ch))X=(X<<)+(X<<)+(ch^),ch=getchar();
  11. return w?-X:X;
  12. }
  13. ll A,B,C;
  14. int n,m,t[N],b[N],nb[N];
  15. inline ll suan(int ed){
  16. ll ans=;
  17. for(int i=;i<=n;i++){
  18. if(t[i]<ed)ans+=(ed-t[i])*C;
  19. else break;
  20. }
  21. for(int i=;i<=m;i++)nb[i]=b[i];
  22. if(A<B){
  23. int l=,r=m;
  24. while(l<r){
  25. if(nb[r]>ed){
  26. int delta=ed-nb[l];
  27. if(delta<)break;
  28. if(nb[r]-delta>ed){
  29. nb[r]-=delta;
  30. nb[l++]=ed;
  31. ans+=A*delta;
  32. }else{
  33. ans+=A*(nb[r]-ed);
  34. nb[l]+=nb[r]-ed;
  35. nb[r--]=ed;
  36. }
  37. }else break;
  38. }
  39. }
  40. for(int i=m;i>=;i--){
  41. if(nb[i]>ed)ans+=(nb[i]-ed)*B;
  42. }
  43. return ans;
  44. }
  45. ll sanfen(int l,int r){
  46. while(){
  47. if(r-l<){
  48. ll ans=suan(r);
  49. for(int i=l;i<r;i++)ans=min(ans,suan(i));
  50. return ans;
  51. }
  52. int mid1=l+(r-l)/,mid2=mid1+(r-l)/;
  53. if(suan(mid1)>suan(mid2))l=mid1;
  54. else r=mid2;
  55. }
  56. }
  57. int main(){
  58. A=read(),B=read(),C=read();
  59. n=read(),m=read();
  60. for(int i=;i<=n;i++)t[i]=read();
  61. for(int i=;i<=m;i++)b[i]=read();
  62. sort(t+,t+n+);sort(b+,b+m+);
  63. printf("%lld\n",sanfen(t[],max(t[n],b[m])));
  64. return ;
  65. }

+++++++++++++++++++++++++++++++++++++++++++

+本文作者:luyouqi233。               +

+欢迎访问我的博客:http://www.cnblogs.com/luyouqi233/+

+++++++++++++++++++++++++++++++++++++++++++

BZOJ4868:[SHOI2017]期末考试——题解的更多相关文章

  1. bzoj4868: [Shoi2017]期末考试(三分法)

    4868: [Shoi2017]期末考试 题目:传送门 题解: Get到一个新姿势...三分法 一开始百度百科的时候下了一跳...中国...的根??? 学懂了之后其实运用起来就根二分差不多啊,不过证明 ...

  2. [bzoj4868][Shoi2017]期末考试

    来自FallDream 的博客,未经允许,请勿转载,谢谢. 有n位同学,每位同学都参加了全部的m门课程的期末考试,都在焦急的等待成绩的公布.第i位同学希望在第ti天或之前得知所.有.课程的成绩.如果在 ...

  3. BZOJ4868 [Shoi2017]期末考试 【三分 + 贪心】

    题目链接 BZOJ4868 题解 最后的答案决定于最后一个公布的成绩 显然这个是答案关于这个时间点是呈凸单调的 三分一下这个时间点 时间点固定,在这个时间前的人都会产生不愉快度,在这个时间前的科目可以 ...

  4. BZOJ4868 Shoi2017期末考试(三分+贪心)

    容易想到枚举最晚发布成绩的课哪天发布,这样与ti和C有关的贡献固定.每门课要么贡献一些调节次数,要么需要一些调节次数,剩下的算贡献也非常显然.这样就能做到平方级别了. 然后大胆猜想这是一个凸函数三分就 ...

  5. 并不对劲的bzoj4868: [Shoi2017]期末考试

    传送门-> 三分裸题. 发现答案只和最后一个科目公布成绩的时间有关. 科目公布成绩的时间越早,老师们的不愉快度越高,这个时间越晚,学生们的不愉快度越高. 它看上去像个单峰的,那么就三分好了. 判 ...

  6. NC20439 [SHOI2017]期末考试

    NC20439 [SHOI2017]期末考试 题目 题目描述 有 \(n\) 位同学,每位同学都参加了全部的 \(m\) 门课程的期末考试,都在焦急的等待成绩的公布.第 \(i\) 位同学希望在第 \ ...

  7. 【bzoj4868】[Shoi2017]期末考试 前缀和+暴力

    题目描述 有n位同学,每位同学都参加了全部的m门课程的期末考试,都在焦急的等待成绩的公布.第i位同学希望在第ti天或之前得知所.有.课程的成绩.如果在第ti天,有至少一门课程的成绩没有公布,他就会等待 ...

  8. 【BZOJ4868】期末考试(整数三分)

    题意: 有n位同学,每位同学都参加了全部的m门课程的期末考试,都在焦急的等待成绩的公布.第i位同学希望在第ti天 或之前得知所.有.课程的成绩.如果在第ti天,有至少一门课程的成绩没有公布,他就会等待 ...

  9. bzoj 4868: [Shoi2017]期末考试

    Description 有n位同学,每位同学都参加了全部的m门课程的期末考试,都在焦急的等待成绩的公布.第i位同学希望在第ti天 或之前得知所.有.课程的成绩.如果在第ti天,有至少一门课程的成绩没有 ...

随机推荐

  1. 小程序页面的四种文件(JSON、WXML、WXSS、JS)加载顺序

    一个小程序页面由四种文件组成: 1)json 页面配置文件 2)js 页面逻辑文件(必需) 3)wxml 页面结构文件(必需) 4)wxss 页面样式文件 这四个文件的加载顺序: 第一步: 加载页面j ...

  2. 使用Docker部署java web项目

    在国内可能会有源下载失败问题,docker安装失败, 这里提供docker离线安装包如有需要可以进行下载 docker离线安装包下载 ##本文环境使用centos 7 进行部署. #1安装docker ...

  3. gossip版本raft算法实现

    raft算法的实现概述 节点的启动和加入: 1. 第一个节点启动,发现没有其他的member节点,则自己变成master 2. 第二个节点启动并加入第一个节点,发现有member节点,并且master ...

  4. 在 CentOS 下手工安装 Docker v1.1x

    Docker在 centos 6.x 下面默认最新的版本是1.7, 然而这个并不符合我的实际需求, 尤其我需要 docker-compose 来作为编配工具部署swarm, 所以我只有手工安装了. 首 ...

  5. SGU 176 Flow construction(有源汇上下界最小流)

    Description 176. Flow construction time limit per test: 1 sec. memory limit per test: 4096 KB input: ...

  6. svn升级(mac)

    原文链接:http://www.jianshu.com/p/c81712ecccb8 升级前 svn版本1.7.20 升级之后 1.9.2 步骤: 1. 下载最新版svn,链接:http://www. ...

  7. java实现屏幕共享的小程序

          最近在做软件软件工程的课程设计,做一个用于实验室的屏幕监控系统,参考各种前人代码,最后领悟之后要转换自己的代码,初学者都是这样模仿过来的.       说到屏幕监控系统,有教师断和学生端, ...

  8. NIO 服务端TCP连接管理的方案

    最近做的一个项目需要在服务端对连接端进行管理,故将方案记录于此. 方案实现的结果与背景 因为服务端与客户端实现的是长连接,所以需要对客户端的连接情况进行监控,防止无效连接占用资源. 完成类似于心跳的接 ...

  9. 项目选题报告(I konw)

    一.团队成员及分工 团队名称:I know 团队成员: 陈家权:选题报告word撰写 赖晓连:ppt制作,原型设计 雷晶:ppt制作,原型设计 林巧娜:原型设计,博客随笔撰写 庄加鑫:选题报告word ...

  10. File文件以及.propertites文件操作

    File文件操作 在jsp和class文件中调用的相对路径不同.在jsp里,根目录是WebRoot 在class文件中,根目录是WebRoot/WEB-INF/classes 当然你也可以用Syste ...