题目描述

有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)时间内算出答案,求最小值即可。

#include<algorithm>
#include<iostream>
#include<cstring>
#include<cstdio>
#include<cmath>
#define LL long long
#define M 200040
#define inf (1e15)
using namespace std;
LL read(){
LL nm=,fh=;char cw=getchar();
for(;!isdigit(cw);cw=getchar()) if(cw=='-') fh=-fh;
for(;isdigit(cw);cw=getchar()) nm=nm*+(cw-'');
return nm*fh;
}
LL n,m,A,B,C,p[M],t[M],c[M],pre[M],cst,ps;
LL res,maxn,st[M],num,pos,sum,ans;
LL find(LL ti){
LL L=,R=m,tk=,mid;
while(L<=R){
mid=(L+R>>);
if(p[mid]<=ti) tk=mid,L=mid+;
else R=mid-;
}
return tk;
}
LL findt(LL ti){
LL L=,R=n,tk=,mid;
while(L<=R){
mid=(L+R>>);
if(t[mid]<ti) tk=mid,L=mid+;
else R=mid-;
}
return tk;
}
LL gt_ans(LL ti){
pos=find(ti),num=pre[m]-pre[pos]-((m-pos)*ti);
res=(pos*ti)-pre[pos],ps=findt(ti);
if(ti>=t[]) sum=(ps*ti-st[ps])*C;
else sum=;
if(num<=res) sum+=num*min(A,B);
else sum+=(num-res)*B+res*min(A,B);
return sum;
}
int main(){
A=read(),B=read(),C=read();
n=read(),m=read();
memset(&ans,0x7f,sizeof(LL));
for(LL i=;i<=n;i++) t[i]=read();
for(LL i=;i<=m;i++) p[i]=read();
sort(t+,t+n+),sort(p+,p+m+),maxn=p[m];
for(LL i=;i<=n;i++) st[i]=st[i-]+t[i];
for(LL i=;i<=m;i++) pre[i]=pre[i-]+p[i];
if(C>inf) ans=gt_ans(t[]);
else for(LL i=;i<=maxn;i++) cst=gt_ans(i),ans=min(ans,cst);
printf("%lld\n",ans);
return ;
}

[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. Lumen开发:结合Redis实现消息队列(2)

    上一篇讲了Lumen配置Redis,现在来讲一下,如何实现消息队列 2.编写任务类 2.1  任务类结构 默认情况下,应用的所有队列任务都存放在app/Jobs目录.任务类非常简单,正常情况下只包含一 ...

  2. poj2891(线性同余方程组)

    一个exgcd解决一个线性同余问题,多个exgcd解决线性同余方程组. Strange Way to Express Integers Time Limit: 1000MS   Memory Limi ...

  3. [精]poj2724

    Purifying Machine Time Limit: 2000MS   Memory Limit: 65536K Total Submissions: 5027   Accepted: 1455 ...

  4. Eureka集群搭建

    服务注册.发现是微服务架构的关键原理之一,由于微服务架构是由一系列职责单一的细粒度服务构成的网状结构,服务之间通过轻量机制进行通信,这就必然引入一个服务注册发现的问题,也就是说服务提供方要注册报告服务 ...

  5. 九度OJ 1195:最长&最短文本 (搜索)

    时间限制:1 秒 内存限制:32 兆 特殊判题:否 提交:3144 解决:1156 题目描述: 输入多行字符串,请按照原文本中的顺序输出其中最短和最长的字符串,如果最短和最长的字符串不止一个,请全部输 ...

  6. MyBatis:学习笔记(4)——动态SQL

    MyBatis:学习笔记(4)——动态SQL

  7. Vue-cli创建项目从单页面到多页面3-关于将打包后的项目文件不放在根目录下

    关于将打包后的项目文件不放在根目录下 有时候,我们总是需要这样的设置:希望将打包后的文件放在a.b.com/somepath/这样一个路径下. 然而在vue-cli创建的项目中,默认的打包路径中的静态 ...

  8. Python OOP(1)

    类(Class): 用来描述具有相同的属性和方法的对象的集合.它定义了该集合中每个对象所共有的属性和方法.对象是类的实例. 类变量:类变量在整个实例化的对象中是公用的.类变量定义在类中且在函数体之外. ...

  9. Facial landmark detection - 人脸关键点检测

    Facial landmark detection  (Facial keypoints detection) OpenSourceLibrary: DLib Project Home:  http: ...

  10. Data Structure Array: Longest Monotonically Increasing Subsequence Size

    http://www.geeksforgeeks.org/longest-monotonically-increasing-subsequence-size-n-log-n/ #include < ...