[SHOI2017]期末考试
题目描述
有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]期末考试的更多相关文章
- bzoj4868: [Shoi2017]期末考试(三分法)
4868: [Shoi2017]期末考试 题目:传送门 题解: Get到一个新姿势...三分法 一开始百度百科的时候下了一跳...中国...的根??? 学懂了之后其实运用起来就根二分差不多啊,不过证明 ...
- NC20439 [SHOI2017]期末考试
NC20439 [SHOI2017]期末考试 题目 题目描述 有 \(n\) 位同学,每位同学都参加了全部的 \(m\) 门课程的期末考试,都在焦急的等待成绩的公布.第 \(i\) 位同学希望在第 \ ...
- bzoj 4868: [Shoi2017]期末考试
Description 有n位同学,每位同学都参加了全部的m门课程的期末考试,都在焦急的等待成绩的公布.第i位同学希望在第ti天 或之前得知所.有.课程的成绩.如果在第ti天,有至少一门课程的成绩没有 ...
- [bzoj4868][Shoi2017]期末考试
来自FallDream 的博客,未经允许,请勿转载,谢谢. 有n位同学,每位同学都参加了全部的m门课程的期末考试,都在焦急的等待成绩的公布.第i位同学希望在第ti天或之前得知所.有.课程的成绩.如果在 ...
- BZOJ4868:[SHOI2017]期末考试——题解
http://www.lydsy.com/JudgeOnline/problem.php?id=4868 题目复制于洛谷:https://www.luogu.org/problemnew/show/P ...
- 【bzoj4868】[Shoi2017]期末考试 前缀和+暴力
题目描述 有n位同学,每位同学都参加了全部的m门课程的期末考试,都在焦急的等待成绩的公布.第i位同学希望在第ti天或之前得知所.有.课程的成绩.如果在第ti天,有至少一门课程的成绩没有公布,他就会等待 ...
- BZOJ-1- 4868: [Shoi2017]期末考试-三分
三分出成绩时间,假设当前出成绩最优,那么提前就会调增老师,增加不愉快度多于少等待的:如果延迟时间. 那么等待更久,增加的不愉快度也将多余少调增剩省下的. 于是:对于当前点,两边都是有单调性的. 就是说 ...
- BZOJ4868 [Shoi2017]期末考试 【三分 + 贪心】
题目链接 BZOJ4868 题解 最后的答案决定于最后一个公布的成绩 显然这个是答案关于这个时间点是呈凸单调的 三分一下这个时间点 时间点固定,在这个时间前的人都会产生不愉快度,在这个时间前的科目可以 ...
- BZOJ4868 Shoi2017期末考试(三分+贪心)
容易想到枚举最晚发布成绩的课哪天发布,这样与ti和C有关的贡献固定.每门课要么贡献一些调节次数,要么需要一些调节次数,剩下的算贡献也非常显然.这样就能做到平方级别了. 然后大胆猜想这是一个凸函数三分就 ...
随机推荐
- .Net 开发Windows Service
1.首先创建一个Windows Service 2.创建完成后切换到代码视图,代码中默认有OnStart和OnStop方法执行服务开启和服务停止执行的操作,下面代码是详细解释: using Syste ...
- 使用java命令运行class文件带包名时出错
会出现classnotfound的错误. 如:文件x:/Test.java; package xx public class Test{} javac 编译后,java命令出错,需要手动构建包目录xx ...
- Linux进程间通信(IPC)机制总览
Linux进程间通信 Ø 管道与消息队列 ü 匿名管道,命名管道 ü 消息队列 Ø 信号 ü 信号基础 ü 信号应用 Ø 锁与信号灯 ü 记录锁 ü 有名信号灯 ü 无名信号灯(基 ...
- uiwebview 屏幕自适应 -- 根据 内容适应或者 webview适应
#import <UIKit/UIKit.h> @interface ViewController : UIViewController<UIWebViewDelegate,UISe ...
- Python 字符串拼接、格式化输出、深浅复制
拼接:"+"号(同类型可拼接) >>>li = [1,2] >>>li + li [1,2,1,2] >>>li*2 [1,2 ...
- asp.net mvc 反射应用
using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.T ...
- 九度OJ 1189:还是约瑟夫环 (约瑟夫环)
时间限制:1 秒 内存限制:32 兆 特殊判题:否 提交:820 解决:522 题目描述: 生成一个长度为21的数组,依次存入1到21: 建立一个长度为21的单向链表,将上述数组中的数字依次存入链表每 ...
- 软RAID5制作流程
说明:本实验没有用到多个磁盘,而是利用单个磁盘划分出的多个分区来仿真的,如果在实际项目中,请依情况而定. 1. 分区 我这里划分6个分区,用4个分区组成RAID 5,用1个分区作为spare disk ...
- Django之CURD插件
什么是CURD? CURD顾名思义就是create,update,rearch,delete(所谓的增删改查). 当我们接到一个项目的时候,夸夸夸的就写完表结构,然后就一直写增删改查,增删改查,写了一 ...
- python3 生成随即激活码
import string import random #激活码中的字符和数字 field = string.ascii_letters + string.digits #获得四个字母和数字的随即组合 ...