题目描述

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

第 iii 位同学希望在第 tit_iti​ 天或之前得知所有课程的成绩。如果在第 tit_iti​ 天,有至少一门课程的成绩没有公布,他就会等待最后公布成绩的课程公布成绩,每等待一天就会产生 CCC 不愉快度。

对于第 iii 门课程,按照原本的计划,会在第 bib_ibi​ 天公布成绩。

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

  1. 将负责课程 XXX 的部分老师调整到课程 YYY,调整之后公布课程 XXX 成绩的时间推迟一天,公布课程 YYY 成绩的时间提前一天;每次操作产生 AAA 不愉快度。
  2. 增加一部分老师负责学科 ZZZ,这将导致学科 ZZZ 的出成绩时间提前一天;每次操作产生 BBB 不愉快度。

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

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

输入输出格式

输入格式:

第一行三个非负整数 A,B,CA, B, CA,B,C,描述三种不愉快度,详见【题目描述】;
第二行两个正整数 n,mn, mn,m,分别表示学生的数量和课程的数量;
第三行 nnn 个正整数 tit_iti​,表示每个学生希望的公布成绩的时间;
第四行 mmm 个正整数 bib_ibi​,表示按照原本的计划,每门课程公布成绩的时间。

输出格式:

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

输入输出样例

输入样例#1:
复制

100 100 2
4 5
5 1 2 3
1 1 2 3 3
输出样例#1: 复制

6
输入样例#2: 复制

3 5 4
5 6
1 1 4 7 8
2 3 3 1 8 2
输出样例#2: 复制

33

说明

【样例 1 说明】

由于调整操作产生的不愉快度太大,所以在本例中最好的方案是不进行调整; 全部

5 的门课程中,最慢的在第 3 天出成绩;

同学 1 希望在第 5 天或之前出成绩,所以不会产生不愉快度;

同学 2 希望在第 1 天或之前出成绩,产生的不愉快度为 (3 − 1) ∗ 2 = 4;

同学 3 希望在第 2 天或之前出成绩,产生的不愉快度为 (3 − 2) ∗ 2 = 2;

同学 4 希望在第 3 天或之前出成绩,所以不会产生不愉快度;

不愉快度之和为 4 + 2 = 6 。

题解:

   不知道为什么,最近总是做贪心题,这个题目,我们发现序列的答案只和最后一门公布答案的学科的时间有关,于是我们枚举最后一门学科公布的时间x,强制让所有的学科在这一天之前前公布,统计前面学科可以救助他们的次数和要让所有科目都在x之前的最小操作次数,比较A和B,尽量用小的就可以了.

  不知道为什么必须开unsigned long long,不然会wa两个点.

代码:

  

#include <cstdio>
#include <iostream>
#include <algorithm>
#include <cstring>
#include <cmath>
#include <iostream>
#define MAXN 200010
#define ll unsigned long long
using namespace std;
ll A,B,C;
ll a[MAXN],b[MAXN],suma[MAXN],sumb[MAXN];
ll n,m,maxx,ans=1ll<<; int erfen(ll s[],int l,int r,int now){
int ans=,mid;
while(l<=r){
int mid=(l+r)/;
if(s[mid]<=now) ans=mid,l=mid+;
else r=mid-;
}
return ans;
} ll work(int now){
ll sav=,cos=,ps;
ps=erfen(b,,m,now);
sav=ps*now-sumb[ps],cos=(sumb[m]-sumb[ps])-(m-ps)*now;
ll ex=,bs=;
ps=erfen(a,,n,now);
bs=max((now*ps-suma[ps])*C,(ll));
if(A>=B) ex=cos*B;
else{
if(sav>=cos) ex=cos*A;
else ex=sav*A+(cos-sav)*B;
}
return bs+ex;
} int main()
{
cin>>A>>B>>C;cin>>n>>m;
for(int i=;i<=n;i++) scanf("%lld",&a[i]);
for(int i=;i<=m;i++) scanf("%lld",&b[i]),maxx=max(maxx,b[i]);
sort(a+,a+n+);
sort(b+,b+m+);
for(int i=;i<=n;i++) suma[i]=suma[i-]+a[i];
for(int i=;i<=m;i++) sumb[i]=sumb[i-]+b[i];
for(int i=;i<=maxx;i++) ans=min(ans,work(i));
printf("%lld",ans);
return ;
}

最新文章

  1. OS的沙盒机制 --基础知识
  2. ImageLoader
  3. 习题:codevs 1035 火车停留解题报告
  4. PHOG特征
  5. MySql循环插入数据(定义了存储过程)
  6. Android 动画之AlphaAnimation应用详解
  7. How to export a template in Visual Studio?
  8. Shell的概念
  9. HDU 2433 Travel (最短路,BFS,变形)
  10. javaScript 类型判断
  11. eclipse(myEclipse) 配置maven项目
  12. Maven 版 JPA 最佳实践(转)
  13. JavaFx的一些总结
  14. PAT1012
  15. 康复计划#4 快速构造支配树的Lengauer-Tarjan算法
  16. Sublime编辑器的使用
  17. 批量修改git仓库地址脚本
  18. 深入解析C语言数组和指针
  19. UI组件--element-ui--Upload多组件自定义上传
  20. addEventListener() 方法,事件监听

热门文章

  1. 降维和PCA
  2. [大数据学习研究] 3. hadoop分布式环境搭建
  3. Java连载32-对象、类及其关系与定义
  4. 最大公共子序列(Runtime faster than 92.73% of Python3)
  5. 纯css耍个透明正方体转一转
  6. Mongodb关于查询返回指定字段的方法记录
  7. Mac搭建pyhton+selenium+pycharm实现web自动化测试
  8. [vue] vue服务端渲染nuxt.js
  9. 软件测试的分类&amp;软件测试生命周期
  10. rpm方式升级cenos6.7内核