设cost为不愉快值之和
观察到,若课程成绩公布的太晚,则学生等待产生的C过多。若课程成绩公布的太早,学生等待的C值不会继续减少,而教师调整产生的A或B值反而过多,于是猜测是个单峰的函数,进行三分判断
#include <iostream>
using namespace std;
typedef long long ll;
const int N = 1e5 + 10;
const ll INF = 9223372036854775807ll;
ll stu[N], t[N];
ll n, m, a, b, c;
ll val(ll x){
ll cost = 0;
ll left = 0, right = 0;
for(int i =1; i <= n; i++){
cost += max((ll)0, x - stu[i]) * c;
}
for(int i = 1; i <= m; i++){
if(t[i] < x) left += x - t[i];
if(t[i] > x) right += t[i] - x;
}
if(a < b)
cost += min(left, right) * a + (right - min(left, right)) * b;
else
cost += right * b;
return cost;
}
int main(){
cin >> a >> b >> c;
cin >> n >> m;
ll l = INF, r = 0;
for(int i = 1; i <= n; i ++){
cin >> stu[i];
l = min(l, stu[i]);
}
for(int i = 1; i <= m; i ++){
cin >> t[i];
sum += t[i];
r = max(t[i], r);
}
if(c == (ll)1e16){ //搞不明白为什么1e16的数据要单独判断qwq
cout << val(l);
return 0;
}
while(l < r){
int midl = l + (r - l) / 3;
int midr = r - (r - l) / 3;
// cout << l << "(" << val(midl) << ")" << "<->" << r << "(" << val(midr) << ")"<< endl;
if(val(midl) >= val(midr)) l = midl + 1;
else r = midr - 1;
}
cout << val(l) << endl;
return 0;
}