[六省联考 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 天公布成绩。
有如下两种操作可以调整公布成绩的时间:
- 将负责课程 X X X 的部分老师调整到课程 Y Y Y,调整之后公布课程 X X X 成绩的时间推迟一天,公布课程 Y Y Y 成绩的时间提前一天;每次操作产生 A A A 不愉快度。
- 增加一部分老师负责学科 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
(3−1)×2=4;
同学
3
3
3 希望在第
2
2
2 天或之前出成绩,产生的不愉快度为
(
3
−
2
)
×
2
=
2
(3 - 2) \times 2 = 2
(3−2)×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 1≤n,m,ti,bi≤2000 | 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;0≤C≤102 |
3, 4 | 1 ≤ n , m , t i , b i ≤ 2000 1 \leq n, m, t_i, b_i \leq 2000 1≤n,m,ti,bi≤2000 | 0 ≤ A ; C ≤ 1 0 2 ; B = 1 0 9 0 \leq A; C \leq 10^2; B = 10^9 0≤A;C≤102;B=109 |
5, 6, 7, 8 | 1 ≤ n , m , t i , b i ≤ 2000 1 \leq n, m, t_i, b_i \leq 2000 1≤n,m,ti,bi≤2000 | 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 0≤B≤A≤102;0≤C≤102 |
9 - 12 | 1 ≤ n , m , t i , b i ≤ 2000 1 \leq n, m, t_i, b_i \leq 2000 1≤n,m,ti,bi≤2000 | 0 ≤ A , B , C ≤ 1 0 2 0 \leq A, B, C \leq 10^2 0≤A,B,C≤102 |
13, 14 | 1 ≤ n , m , t i , b i ≤ 1 0 5 1 \leq n, m, t_i, b_i \leq 10^5 1≤n,m,ti,bi≤105 | 0 ≤ A , B ≤ 1 0 5 ; C = 1 0 16 0 \leq A, B \leq 10^5; C = 10^{16} 0≤A,B≤105;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 1≤n,m,ti,bi≤105 | 0 ≤ A , B , C ≤ 1 0 5 0 \leq A, B, C \leq 10^5 0≤A,B,C≤105 |
代码实现:
#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;
}