这题有点绕,我写了\(2h\)终于搞明白了。

主要思路:枚举最晚公布成绩的时间\(maxt\),然后将所有公布时间大于\(maxt\)的课程都严格降为\(maxt\)即可。

在此之前,还要搞清楚一个概念:对于第二种操作,它只有将某一门课提前,但是第一种操作,它还会在提前的过程中延迟某一门课。所以,在不考虑代价的情况下,选择第二种操作是更优也更快捷的。

接下来考虑分情况贪心。

  • 如果\(A \geq B\),说明第一种操作比第二种操作的代价来的高,操作也没有第二种优,所以肯定优先选择第二种操作。

  • 如果\(A<B\),说明第一种操作的代价比较小,所以可以先选第一种到不能选为止(已经没有课程可以延迟),剩余的再选第二种。

于是再算一下在最晚公布时间为\(i\)的情况下学生们的不愉快度即可。

实现过程

  • \(A \geq B\)的情况

此时我们要计算有多少门课公布的时间大于\(i\),我们可以先考虑将所有的课程按公布时间排序,然后把公布时间比\(i\)晚的课程先计算出来,这里我就用\(x\)来表示数量,则将这些课程公布的时间记作\(a_{m-x+1},a_{m-x+2}……a_m\)。

而我们的意图是将这里所有的值都化为\(i\),这其中经过的时间为\(a_{m-x+1}+a_{m-x+2}+……+a_m-i \times x\)

代价为\((a_{m-x+1}+a_{m-x+2}+……+a_m-i \times x) \times B\)

这个东西我们可以用前缀和\(O(1)\)的求出,而\(x\)的值怎么求可以参考我的代码。

  • \(A<B\)的情况

一样的,先算出要将其化为\(i\)需要经过的时间:

\(a_{m-x+1}+a_{m-x+2}+……+a_m-i \times x\) \((\)记作\(t1)\)

然后再算比\(i\)早公布时间的课程,我们可以将其延迟至\(i\)时间公布。

\(i \times (m-x) -(a_{1}+a_{2}+……+a_x)\) \((\)记作\(t2)\)

比较\(t1\)和\(t2\),如果\(t1 \leq t2\),说明可以全部用第一种操作搞定,代价为:\(t1 \times A\)

否则,剩余的再用第二种操作,代价为:\(t2 \times A+(t1-t2) \times B\)

  • 学生的不愉快度

考虑用一个\(Num\)记录在最晚公布时间为\(i\)的情况下不愉快的学生,将\(t_i\)从小到大排序,则不愉快的学生的等待时间记为:\(t_1,t_2,t_3……t_{Num}\)

总等待时间为:

\(i \times Num-(t_1+t_2+t_3……+t_{Num})\)

不愉快度为:

\((i \times Num-(t_1+t_2+t_3……+t_{Num})) \times C\)

那么最后注意一下用\(ull\),然后套柿子就没了。

\(Code:\)

#include<bits/stdc++.h>
#define long unsigned long long
using namespace std;
inline int read(){
register int s=0,f=1;
register char ch=getchar();
while(!isdigit(ch)){if(ch=='-')f*=-1;ch=getchar();}
while(isdigit(ch))s=(s<<1)+(s<<3)+(ch^48),ch=getchar();
return s*f;
}
const int max_n=100000+5;
long late[max_n],Time[max_n];
long sum[max_n],f[max_n],num[max_n],h[max_n],maxt;
long Max(long a,long b){
if(a>b)return a;
return b;
}
long Min(long a,long b){
if(a<b)return a;
return b;
}
int main(){
ios::sync_with_stdio(false);
long A=read(),B=read(),C=read();
long n=read(),m=read();
for(int i=1;i<=n;i++)late[i]=read();
for(int i=1;i<=m;i++)Time[i]=read();//读入
sort(Time+1,Time+m+1);//排序
for(int i=1;i<=m;i++){
maxt=max(maxt,Time[i]),sum[Time[i]]++;
//找最晚公布的时间 //记录当前值,方便统计
f[i]=f[i-1]+Time[i];//求前缀和
}
sort(late+1,late+n+1);//排序
long Num=0;//不愉快的学生
for(int i=1;i<=n;i++){
num[late[i]]++,h[i]=h[i-1]+late[i];
if(late[i]<=maxt)Num=i;
}
long ans=LONG_LONG_MAX;
long x=0;//公布时间比i晚的课程
for(int i=maxt;i>=1;i--){
Num-=num[i];
long tot=0;
if(A>=B){
long day=f[m]-f[m-x]-x*i;
tot=Max(day*B,0);
}else{
long day1=f[m]-f[m-x]-x*i;
long day2=(m-x)*i-f[m-x];
if(day1<=day2)tot=Max(day1*A,0);
else tot=Max(day2*A+(day1-day2)*B,0);
}//贪心的核心部分,具体见分析,注意要严格保证不能为负数
tot+=Max(Num*i-h[Num],0)*C;//加上学生的不愉快度
x+=sum[i];//更新
ans=Min(ans,tot);//取最小
}
cout<<ans<<endl;
return 0;
}

\(\operatorname{Update}\) \(\operatorname{On}\) \(\operatorname{2019.08.22}\)

题解 洛谷P3745 【[六省联考2017]期末考试】的更多相关文章

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

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

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

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

  3. [luogu] P3745 [六省联考2017]期末考试 (贪心)

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

  4. 【BZOJ4868】[六省联考2017]期末考试(贪心)

    [BZOJ4868][六省联考2017]期末考试(贪心) 题面 BZOJ 洛谷 题解 显然最终的答案之和最后一个公布成绩的课程相关. 枚举最后一天的日期,那么维护一下前面有多少天可以向后移,后面总共需 ...

  5. 洛谷 P3747 [六省联考2017]相逢是问候 解题报告

    P3747 [六省联考2017]相逢是问候 题目描述 \(\text {Informatik verbindet dich und mich.}\) 信息将你我连结. \(B\) 君希望以维护一个长度 ...

  6. [BZOJ4868][六省联考2017]期末考试(三分)

    4868: [Shoi2017]期末考试 Time Limit: 20 Sec  Memory Limit: 512 MBSubmit: 964  Solved: 439[Submit][Status ...

  7. 洛谷P3749 [六省联考2017]寿司餐厅

    传送门 题解 这几道都是上周llj讲的题,题解也写得十分好了,所以直接贴了几个链接和代码. //Achen #include<algorithm> #include<iostream ...

  8. 洛谷 P3750 [六省联考2017]分手是祝愿

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

  9. 洛谷P3747 [六省联考2017]相逢是问候

    传送门 题解 扩展欧拉定理. 线段树维护,已经全改到底了的节点就不管,不然暴力修改下去. //Achen #include<algorithm> #include<iostream& ...

随机推荐

  1. Anaconda无法更新

    在安装完Anaconda,更新包时 C:\Users\Administrator>conda upgrade --all WARNING: The conda.compat module is ...

  2. 15 Filter过滤器和Listener监听器

    1.Filter:过滤器 (1) 概念:生活中的过滤器:净水器,空气净化器,土匪.web中的过滤器:当访问服务器的资源时,过滤器可以将请求拦截下来,完成一些特殊的功能.过滤器的作用:一般用于完成通用的 ...

  3. poj 1095 题解(卡特兰数+递归

    题目 题意:给出一个二叉树的编号,问形态. 编号依据 1:如果二叉树为空,则编号为0: 2:如果二叉树只有一个节点,则编号为1: 3:所有含有m个节点的二叉树的编号小于所有含有m+1个节点的二叉树的编 ...

  4. Python-13-模块和包

    一.模块的概念 在计算机程序的开发过程中,随着程序代码越写越多,在一个文件里代码就会越来越长,越来越不容易维护. 为了编写可维护的代码,我们把很多函数分组,分别放到不同的文件里,这样,每个文件包含的代 ...

  5. python3 最基础

    python 2乱码,源码混了,代码重复,ascii码 一个字节表示 显示中文 只有英文 python 3 utf-8 三个字节 表示中文 int 整型 str 字符串 类型 bool 布尔值 Tru ...

  6. hadoop 异常

    2019-09-20 22:49:51,955 WARN org.apache.hadoop.hdfs.server.datanode.DataNode: Problem connecting to ...

  7. xxx商城之商品管理

  8. GOF 的23种JAVA常用设计模式总结 02 UML中的类图与类图之间的关系

    统一建模语言UML 统一建模语言(Unified Modeling Language,UML)是用来设计软件蓝图的可视化建模语言,1997 年被国际对象管理组织(OMG)采纳为面向对象的建模语言的国际 ...

  9. HTTPDNS

    传统 DNS 缺点 1.域名缓存问题     它可以在本地做一个缓存,也就是说,不是每一个请求,它都会去访问权威 DNS 服务器,而是访问过一次就把结果缓存到自己本地,当其他人来问的时候,直接就返回这 ...

  10. Java 环境

    1. Java 环境1999年发布第二代java平台 简称 Java2 标准版 Standard Edition J2SE 企业版 Enterprise Edition J2EE 微型版 Micro ...