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

[六省联考 2017] 期末考试

题目描述

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

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

对于第 i i i 门课程,按照原本的计划,会在第 b i b_i bi 天公布成绩。

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

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

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

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

输入格式

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

输出格式

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

样例 #1

样例输入 #1

100 100 2
4 5
5 1 2 3
1 1 2 3 3

样例输出 #1

6

样例 #2

样例输入 #2

3 5 4
5 6
1 1 4 7 8
2 3 3 1 8 2

样例输出 #2

33

提示

样例解释 1

由于调整操作产生的不愉快度太大,所以在本例中最好的方案是不进行调整;全部的 5 5 5 门课程中,最慢的在第 3 3 3 天出成绩;
同学 1 1 1 希望在第 5 5 5 天或之前出成绩,所以不会产生不愉快度;
同学 2 2 2 希望在第 1 1 1 天或之前出成绩,产生的不愉快度为 ( 3 − 1 ) × 2 = 4 (3 - 1) \times 2 = 4 (31)×2=4
同学 3 3 3 希望在第 2 2 2 天或之前出成绩,产生的不愉快度为 ( 3 − 2 ) × 2 = 2 (3 - 2) \times 2 = 2 (32)×2=2
同学 4 4 4 希望在第 3 3 3 天或之前出成绩,所以不会产生不愉快度;
不愉快度之和为 4 + 2 = 6 4 + 2 = 6 4+2=6

数据范围

Case # n , m , t i , b i n, m, t_i, b_i n,m,ti,bi A , B , C A, B, C A,B,C
1, 2 1 ≤ n , m , t i , b i ≤ 2000 1 \leq n, m, t_i, b_i \leq 2000 1n,m,ti,bi2000 A = 1 0 9 ; B = 1 0 9 ; 0 ≤ C ≤ 1 0 2 A = 10^9; B = 10^9; 0 \leq C \leq 10^2 A=109;B=109;0C102
3, 4 1 ≤ n , m , t i , b i ≤ 2000 1 \leq n, m, t_i, b_i \leq 2000 1n,m,ti,bi2000 0 ≤ A ; C ≤ 1 0 2 ; B = 1 0 9 0 \leq A; C \leq 10^2; B = 10^9 0A;C102;B=109
5, 6, 7, 8 1 ≤ n , m , t i , b i ≤ 2000 1 \leq n, m, t_i, b_i \leq 2000 1n,m,ti,bi2000 0 ≤ B ≤ A ≤ 1 0 2 ; 0 ≤ C ≤ 1 0 2 0 \leq B \leq A \leq 10^2; 0 \leq C \leq 10^2 0BA102;0C102
9 - 12 1 ≤ n , m , t i , b i ≤ 2000 1 \leq n, m, t_i, b_i \leq 2000 1n,m,ti,bi2000 0 ≤ A , B , C ≤ 1 0 2 0 \leq A, B, C \leq 10^2 0A,B,C102
13, 14 1 ≤ n , m , t i , b i ≤ 1 0 5 1 \leq n, m, t_i, b_i \leq 10^5 1n,m,ti,bi105 0 ≤ A , B ≤ 1 0 5 ; C = 1 0 16 0 \leq A, B \leq 10^5; C = 10^{16} 0A,B105;C=1016
15 - 20 1 ≤ n , m , t i , b i ≤ 1 0 5 1 \leq n, m, t_i, b_i \leq 10^5 1n,m,ti,bi105 0 ≤ A , B , C ≤ 1 0 5 0 \leq A, B, C \leq 10^5 0A,B,C105

代码实现:

#include<bits/stdc++.h>
const int N=100005;
using namespace std;
typedef long long ll;
int n,m,t[N],b[N];
ll A,B,C,ans;
ll calc1(int p){
	ll x=0,y=0;
	for(int i=1;i<=m;i++){
		if(b[i]<p) x+=p-b[i];
		else y+=b[i]-p;
	}
	if(A<B) return min(x,y)*A+(y-min(x,y))*B;
	else return y*B;
}
ll calc2(int p){
	ll sum=0;
	for(int i=1;i<=n;i++){
		if(t[i]<p) sum+=(p-t[i])*C;
	}
	return sum;
}
int main(){
	cin>>A>>B>>C>>n>>m;
	for(int i=1;i<=n;i++) cin>>t[i];
	for(int i=1;i<=m;i++) cin>>b[i];
	sort(b+1,b+m+1);
	sort(t+1,t+n+1);
	if(C>=1e16){
		cout<<calc1(t[1])<<endl;
		return 0;
	}
	ans=1e16;
	int l=1,r=N;
	while(r-l>2){
		int mid1=l+(r-l)/3;
		int mid2=r-(r-l)/3;
		ll c1=calc1(mid1)+calc2(mid1);
		ll c2=calc1(mid2)+calc2(mid2);
		if(c1<=c2) r=mid2;
		else l=mid1;
	}
	for(int i=l;i<=r;i++){
		ll x=calc1(i)+calc2(i);
		ans=min(ans,x);
	}
	cout<<ans<<endl;
	return 0;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值