三分出成绩时间,假设当前出成绩最优,那么提前就会调增老师,增加不愉快度多于少等待的;如果延迟时间。
那么等待更久,增加的不愉快度也将多余少调增剩省下的。 于是:对于当前点,两边都是有单调性的。
就是说不愉快度随出成绩时间呈单峰函数(这里开口向上),
#include<bits/stdc++.h> using namespace std; #define ll long long #define maxn 123456 ll A,B,C,n,m,a[maxn]; ll b[maxn],l,r,lm,rm,ans; ll ok(ll x) { ll sum=0; for(int i=1; i<=n; i++) if(a[i]<x)sum+=(x-a[i])*C; if(A>B) { for(int i=1; i<=m; i++) if(b[i]>x)sum+=(b[i]-x)*B; } else { ll s1=0,s2=0; for(int i=1; i<=m; i++) { if(b[i]<x)s1+=x-b[i]; if(b[i]>x)s2+=b[i]-x; } if(s2<=s1)sum+=s2*A; else sum+=s1*A+(s2-s1)*B; } return sum; } int main() { scanf("%lld%lld%lld",&A,&B,&C); scanf("%lld%lld",&n,&m); for(int i=1; i<=n; i++) scanf("%lld",&a[i]); for(int i=1; i<=m; i++) scanf("%lld",&b[i]); sort(a+1,a+1+n); sort(b+1,b+1+m); if(C==1e16) printf("%lld ",ok(a[1])); else { l=0,r=111111; while(l+2<r) { lm=l+(r-l+1)/3; rm=r-(r-l+1)/3; if(ok(lm)<ok(rm)) r=rm; else l=lm; } ans=min(min(ok(l),ok(l+1)),ok(l+2)); printf("%lld ",ans); } return 0; }