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

假设 最晚出成绩的是第i天

预处理 cnt[i] 表示 有多少个学生 期望出成绩的那一天 <i

sum[i] 表示 对应cnt[i] 那些学生 的 t 之和

比如  i=5,有4个学生 期望1 2 4 8 出成绩,那么 sum[5]=1+2+4=7,cnt[5]=3

假设 最晚出成绩的是第i天

学生的不愉悦度= (cnt[i]*i-sum[i])*C

类似的方法,算出 当前i下,能提前 某些 科目多少天,能推迟某些科目多少天

more_cnt[i] 表示有多少个科目  期望出成绩的那一天 >i

more_sum[i] 表示 对应more_cnt[i]那些科目的 b 之和

less_cnt[i] 表示有多少个科目  期望出成绩的那一天 <i

less_sum[i] 表示 对less_cnt[i]那些科目的 b 之和

需要提前的总天数=more_sum[i]-more_cnt[i]*i,记为need

可以推迟的总天数=less_cnt[i]*i-less_sum[i],记为have

如果B<=A,那就只 提前,不愉悦度为need*B

如果A<=B,看看可以推迟的 天数 是否>=要 提前的天数

如果>=,那就只 用A,不愉悦度为 need*A

否则,能用A的用A,剩下的用B,不愉悦度为 have*A + (need-have)*B

在预处理出那些数组后,所有的计算都是O(1)的,总时间复杂度为O(n)

三分可以把求解过程优化到 logn

注意有C=1e16,直接乘的话会爆long long

这种情况下一定是 提前科目出成绩的时间,特判即可

考试的时候,特判错了,丢了10分,w(゚Д゚)w

C=1e16,直接学生不愉悦度为 inf,应该是 最晚时间早于所有的期望时间,不愉悦度为0,其余的是inf啊啊啊啊

#include<cstdio>
#include<iostream> using namespace std; #define N 100001 #define min(a,b) ((a)<(b) ? (a) : (b))
#define max(a,b) ((a)>(b) ? (a) : (b)) typedef long long LL; int t[N],b[N];
//subject
int less_cnt[N],more_cnt[N];
LL less_sum[N],more_sum[N]; //student
int cnt[N];
LL sum[N]; template<typename T>
void read(T &x)
{
x=; char c=getchar();
while(!isdigit(c)) c=getchar();
while(isdigit(c)) { x=x*+c-''; c=getchar(); }
} int main()
{
freopen("exam.in","r",stdin);
freopen("exam.out","w",stdout);
int A,B,n,m;
LL C;
read(A); read(B); read(C);
read(n); read(m);
int x,mx=;
for(int i=;i<=n;++i)
{
read(x);
t[x]++;
}
for(int i=;i<=m;++i)
{
read(x);
b[x]++;
mx=max(mx,x);
}
for(int i=mx-;i;--i)
{
more_cnt[i]=more_cnt[i+]+b[i+];
more_sum[i]=more_sum[i+]+1LL*b[i+]*(i+);
}
for(int i=;i<=mx;++i)
{
cnt[i]=cnt[i-]+t[i-];
sum[i]=sum[i-]+1LL*t[i-]*(i-);
less_cnt[i]=less_cnt[i-]+b[i-];
less_sum[i]=less_sum[i-]+1LL*b[i-]*(i-);
}
LL student,subject;
LL ans=1e18;
LL have,need;
for(int i=;i<=mx;++i)
{
if(C<1e16) student=(1LL*cnt[i]*i-sum[i])*C;
else
{
if(1LL*cnt[i]*i-sum[i]) student=1e18;
else student=;
}
if(B<=A) subject=(more_sum[i]-1LL*more_cnt[i]*i)*B;
else
{
have=1LL*less_cnt[i]*i-less_sum[i];
need=more_sum[i]-1LL*more_cnt[i]*i;
if(have>=need) subject=need*A;
else subject=have*A+(need-have)*B;
}
ans=min(ans,student+subject);
}
cout<<ans;
return ;
}

bzoj千题计划262:bzoj4868: [六省联考2017]期末考试的更多相关文章

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

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

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

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

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

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

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

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

  5. 题解 洛谷P3745 【[六省联考2017]期末考试】

    这题有点绕,我写了\(2h\)终于搞明白了. 主要思路:枚举最晚公布成绩的时间\(maxt\),然后将所有公布时间大于\(maxt\)的课程都严格降为\(maxt\)即可. 在此之前,还要搞清楚一个概 ...

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

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

  7. 2017 [六省联考] T1 期末考试

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

  8. 六省联考2017 Day1

    目录 2018.3.18 Test T1 BZOJ.4868.[六省联考2017]期末考试 T2 T3 BZOJ.4870.[六省联考2017]组合数问题(DP 矩阵快速幂) 总结 考试代码 T1 T ...

  9. 【BZOJ4873】[六省联考2017]寿司餐厅(网络流)

    [BZOJ4873][六省联考2017]寿司餐厅(网络流) 题面 BZOJ 洛谷 题解 很有意思的题目 首先看到答案的计算方法,就很明显的感觉到是一个最大权闭合子图. 然后只需要考虑怎么构图就行了. ...

随机推荐

  1. 华为测试大牛Python+Django接口自动化怎么写的?

    有人喜欢创造世界,他们做了开发者:有的人喜欢开发者,他们做了测试员.什么是软件测试?软件测试就是一场本该在用户面前发生的灾难提前在自己面前发生了,这会让他们生出一种救世主的感觉,拯救了用户,也就拯救者 ...

  2. wordpress 5.1 后台拿shell

    闲着没事搭建了一套最新版wordpress 5.1,本身wordpress后台安全防御是比较差的,想尝试下后台是否可以拿shell. 再上传插件的地方可以直接上传php文件,并且该文件可以执行: sh ...

  3. Macaca初体验-PC端(Python)

    前言: Macaca 是一套面向用户端软件的测试解决方案,提供了自动化驱动,周边工具,集成方案.由阿里巴巴公司开源:http://macacajs.github.io/macaca/ 特点: 同时支持 ...

  4. PAT甲题题解-1013. Battle Over Cities (25)-求联通分支个数

    题目就是求联通分支个数删除一个点,剩下联通分支个数为cnt,那么需要建立cnt-1边才能把这cnt个联通分支个数求出来怎么求联通分支个数呢可以用并查集,但并查集的话复杂度是O(m*logn*k)我这里 ...

  5. pandas读取csv数据时设置index

    比如读取数据时想把第一列设为index,那么只需要简单的 pd.read_csv("new_wordvecter.csv",index_col=[0]) 这里index_col可以 ...

  6. 暑假学习笔记(一)——初识Neo4j和APICloud入门

    暑假学习笔记(一)--初识Neo4j和APICloud入门 20180719笔记 1.Neo4j 接了学姐的系统测试报告任务,感觉工作很繁重,但是自己却每天挥霍时光.9月份就要提交系统测试报告了,但是 ...

  7. [转帖]Mysql 开启跟踪的一个方法

    MySQL 事件跟踪器 , MySQL 无须重启服务 跟踪 SQL , 也无须配置日志 原博客地址: https://www.cnblogs.com/wuyifu/p/3328024.html 第一步 ...

  8. 解决Ubuntu14.04下sublime无法输入中文

    原帖地址: (简书作者) http://www.jianshu.com/p/bf05fb3a4709 前言 sublime很好用,但是ubuntu14.04 下不能输入中文,这是一个很大的问题.不知道 ...

  9. browser-sync & http server

    browser-sync & http server browser-sync https://www.browsersync.io/ usage # step 1 $ npm install ...

  10. Python 零基础 快速入门 趣味教程 (咪博士 海龟绘图 turtle) 0. 准备工作

    一.关于 Python Python 是全球使用人数增长最快的编程语言!它易于入门.功能强大,从 Web 后端 到 数据分析.人工智能,到处都能看到 Python 的身影. Python 有两个主要的 ...