//思维还是不够灵活,以前的二分答案基本上都是以题目中要求的入手的。二本题题目所要求的是求总的不愉快度之和最小。 //如果以总和的不愉快度入手的话难以验证是否满足,动不动就从问题出发了。 //看大佬的题解才知道,这道理可以利用的一个固定点在于课程的最晚公布时间,如果最晚公布时间太早可能会因为要调整策略而导致总愉快度变小,如果太晚自然也一样。 //所以在这中间有一个最适合的值。至于他一定是一个凹曲线的证明那当然不去证明,比如咱不是数学的。看着像就可以去尝试。 //因为学生的不愉快仅仅取决于最晚的那个科目的公布时间,那么其实我们已知最晚公布时间,根据最晚公布时间就得到哪些没有达到最晚公布时间的就是我们能够采用策略1去调整的。 //但也不能有空闲就使用策略1去调整,如果A>B的话直接无脑使用方案二即可,如果A<B的话先使用方案1,如果没有空闲的时间就使用方案2. //关于为什么不去考虑直接让某一科超过可能比采用策略更好的情况,因为所有的学生都是根据最晚公布科目来定的,所以三分时间其实也将超出一定的时间的情况涵盖在内了。 #include <bits/stdc++.h> typedef long long ll; using namespace std; const int maxn = 1e5+10; ll A, B, C; int n, m; int t[maxn]; int b[maxn]; ll calc(int x) { ll cnt = 0; if (A>=B) { for (int i=0;i<m;i++) { if (b[i]>x) cnt += B*(b[i]-x); } } else { ll sum1 = 0, sum2 = 0; for (int i=0;i<m;i++) { if (b[i]-x<=0) sum1 += (b[i]-x); if (b[i]-x>0) sum2 += (b[i]-x); } if (sum1+sum2<=0) cnt+=sum2*A; else cnt += (-sum1)*A + (sum1+sum2)*B; } //遍历学生 for (int i=0;i<n;i++) { if (t[i]<x) cnt += (x-t[i])*C; } return cnt; } int main(){ scanf("%lld %lld %lld", &A, &B, &C); scanf("%d %d", &n, &m); int r = 0; for (int i=0;i<n;i++) { scanf("%d", &t[i]); r = max(r, t[i]); } for (int i=0;i<m;i++) { scanf("%d", &b[i]); } //三分寻找最优的最晚公布成绩时间。 int l = 0; ll ans = 9223372036854775807; int a = 0x3f3f3f3f; if(C==10000000000000000) { int d=0x3f3f3f3f; for(int i=0;i<n;i++) d=min(d,t[i]); cout<<calc(d); return 0; } // if (C>=1e16) { // for (int i=0;i<n;i++) ans = min((int)a, t[i]); // printf("%lld", calc(a)); // return 0; // } while (r-l>=10) { // cout<<l<<" "<<r<<endl; int m1 = l+(r-l)/3; int m2 = r-(r-l)/3; // cout<<m1<<" "<<m2<<endl; if (calc(m1)<=calc(m2)) { r = m2; ans = min(ans,calc(m1)); } else { l = m1; ans = min(ans,calc(m1)); } } while (l<=r) { ans = min(ans,calc(l)); l++; } cout<<ans; return 0; }