题目描述

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

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

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

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

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

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

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

输入:

第一行三个非负整数 A; B; C ,描述三种不愉快度,详见【问题描述】;

第二行两个正整数 n; m(1 ≤ n; m ≤ 10^5) ,分别表示学生的数量和课程的数量;

第三行 n 个正整数 ti ,表示每个学生希望的公布成绩的时间;

第四行 m 个正整数 bi ,表示按照原本的计划,每门课程公布成绩的时间。

输出:

输出一行一个整数,表示最小的不愉快度之和。

这道题好多其他人都写的三分,我自己在做的时候还是想的是枚举加前缀和乱搞...

首先我们只关心最后一个成绩公布的时间,所以我们可以先对人和成绩排序,再求前缀和。

这样有什么好处呢,当我们想要求当最后一个成绩公布的时间为k时调整老师的代价时,我们可以先二分划分出公布时间在时限范围内的和不在时限范围内的科目,然后利用前缀和算出需要节约出多少个单位的时间,然后有一个策略显然:

对于已经在时限内的科目,他们的公布时间具体是多少没有意义,但是当1操作的代价低于2操作的代价时,我们可以尽量让这些科目的老师去支援那些后面的老师。

设最后一个成绩是ti,恰好前pos个课程结束的时间在时限范围之内,我们最多可以进行(pos*ti-pre_class[pos])次1操作。

所以对于那些超出时限的科目,他们超出的那些时间单位的前(pos*ti-pre_class[pos])的部分可以通过1、2两种操作中代价最小的进行处理,剩下的部分只能通过2操作进行处理。

通过同样的方法,我们可以算出所有人要等的时间之和。

由于每一个人要求的时间和成绩公布的时间都不超过1e5,所以就可以枚举时间(或者三分),并在O(logn)时间内算出答案,求最小值即可。

  1. #include<algorithm>
  2. #include<iostream>
  3. #include<cstring>
  4. #include<cstdio>
  5. #include<cmath>
  6. #define LL long long
  7. #define M 200040
  8. #define inf (1e15)
  9. using namespace std;
  10. LL read(){
  11. LL nm=,fh=;char cw=getchar();
  12. for(;!isdigit(cw);cw=getchar()) if(cw=='-') fh=-fh;
  13. for(;isdigit(cw);cw=getchar()) nm=nm*+(cw-'');
  14. return nm*fh;
  15. }
  16. LL n,m,A,B,C,p[M],t[M],c[M],pre[M],cst,ps;
  17. LL res,maxn,st[M],num,pos,sum,ans;
  18. LL find(LL ti){
  19. LL L=,R=m,tk=,mid;
  20. while(L<=R){
  21. mid=(L+R>>);
  22. if(p[mid]<=ti) tk=mid,L=mid+;
  23. else R=mid-;
  24. }
  25. return tk;
  26. }
  27. LL findt(LL ti){
  28. LL L=,R=n,tk=,mid;
  29. while(L<=R){
  30. mid=(L+R>>);
  31. if(t[mid]<ti) tk=mid,L=mid+;
  32. else R=mid-;
  33. }
  34. return tk;
  35. }
  36. LL gt_ans(LL ti){
  37. pos=find(ti),num=pre[m]-pre[pos]-((m-pos)*ti);
  38. res=(pos*ti)-pre[pos],ps=findt(ti);
  39. if(ti>=t[]) sum=(ps*ti-st[ps])*C;
  40. else sum=;
  41. if(num<=res) sum+=num*min(A,B);
  42. else sum+=(num-res)*B+res*min(A,B);
  43. return sum;
  44. }
  45. int main(){
  46. A=read(),B=read(),C=read();
  47. n=read(),m=read();
  48. memset(&ans,0x7f,sizeof(LL));
  49. for(LL i=;i<=n;i++) t[i]=read();
  50. for(LL i=;i<=m;i++) p[i]=read();
  51. sort(t+,t+n+),sort(p+,p+m+),maxn=p[m];
  52. for(LL i=;i<=n;i++) st[i]=st[i-]+t[i];
  53. for(LL i=;i<=m;i++) pre[i]=pre[i-]+p[i];
  54. if(C>inf) ans=gt_ans(t[]);
  55. else for(LL i=;i<=maxn;i++) cst=gt_ans(i),ans=min(ans,cst);
  56. printf("%lld\n",ans);
  57. return ;
  58. }

[SHOI2017]期末考试的更多相关文章

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

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

  2. NC20439 [SHOI2017]期末考试

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

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

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

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

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

  5. BZOJ4868:[SHOI2017]期末考试——题解

    http://www.lydsy.com/JudgeOnline/problem.php?id=4868 题目复制于洛谷:https://www.luogu.org/problemnew/show/P ...

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

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

  7. BZOJ-1- 4868: [Shoi2017]期末考试-三分

    三分出成绩时间,假设当前出成绩最优,那么提前就会调增老师,增加不愉快度多于少等待的:如果延迟时间. 那么等待更久,增加的不愉快度也将多余少调增剩省下的. 于是:对于当前点,两边都是有单调性的. 就是说 ...

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

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

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

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

随机推荐

  1. linux下nginx php配置redis

      之前一直遇到,Module compiled with module API=20090626这个坑问题!!! NOTICE: PHP message: PHP Warning: PHP Star ...

  2. TP框架的增删改

    TP添加数据有三种方式 1. //1.使用数组添加 $n = M("nation"); $arr = array("Code"=>"n007&q ...

  3. 实用T-SQL代码

    1.根据出生日期计算当前已满周岁 DECLARE @birth datetime SET @birth='1990-01-01' ),) ),) 2.COUNT(expression) just re ...

  4. 【BZOJ3168】[Heoi2013]钙铁锌硒维生素 高斯消元求矩阵的逆+匈牙利算法

    [BZOJ3168][Heoi2013]钙铁锌硒维生素 Description 银河队选手名单出来了!小林,作为特聘的营养师,将负责银河队选手参加宇宙比赛的饮食.众所周知,前往宇宙的某个星球,通常要花 ...

  5. 在fc6上搭tftpd

    公司的开发环境依然停留在fc6上,,,,对..很旧,旧到想死. 我在没有进一步熟悉ubuntu的基础上,为了保持ABI一致. 只能依旧在FC6 上开发. 可是现在发现开发完成,我要在fc6上文件到wi ...

  6. java servlet中上传文件的简单实现(基于第三方jar)

    这里的案例使用了两种文件上传的组件.分别介绍 1.使用JSPSmartUpload完成上传 package test_servlet_package; import java.io.File; imp ...

  7. 网站存储session的方案

    1: ASP.NET State Service是什么 用来管理 Session 的,正常来说,Session 位于IIS进程中(其实可以理解成在服务器的内存中),当IIS重启或程序池回收会自动清空S ...

  8. iOS 推送跳转到相关页面

    哈哈哈 我又来窃取别人的劳动成果了 写的很好呦 http://www.jianshu.com/p/c0eb32443915

  9. dos与unix文件格式之间的转换

    1. VI编辑器中转换 在VI中使用命令 set ff?(fileformat)可以查看文件的格式,使用set ff=dos(unix)可以设置文件的格式 2.使用sed处理(来至http://www ...

  10. vim 光标的移动和跳转文件的位置

    刚启动vim进入的就是命令模式 在命令模式下 h等于左箭头 j等于下箭头 k等于上箭头 l等于右箭头 想要多次移动可以使用30j或30↓向下移动30行 在命令模式下输入0跳到行头 在命令模式下输入$跳 ...