目录
显示
题目链接
https://www.luogu.com.cn/problem/P3745
题解
枚举最晚公布成绩的时间 \(maxt\)。
对于公布成绩时间比 \(maxt\) 晚的,我们需要把它们提前。
分两种情况讨论:
- \(A \geq B\) 时,此时执行操作 2 最划算,直接将需要提前的科目全部提前即可;
- \(A \lt B\) 时,此时操作 1 最划算,我们将那些有空余时间的科目尽量延后,无法调整时再执行操作 2。
实现的时候,用前缀和维护总等待时间和调整量即可。
#include <iostream> #include <algorithm> using namespace std; typedef unsigned long long ull; ull t[100005],b[100005],s1[100005],s2[100005]; int p[100005],q[100005]; int main() { ios::sync_with_stdio(false); ull A,B,C; int n,m; cin>>A>>B>>C; cin>>n>>m; for(int i=1;i<=n;i++) cin>>t[i]; for(int i=1;i<=m;i++) cin>>b[i]; sort(t+1,t+n+1); sort(b+1,b+m+1); for(int i=1;i<=n;i++) p[t[i]]++,s1[i]=s1[i-1]+t[i]; for(int i=1;i<=m;i++) q[b[i]]++,s2[i]=s2[i-1]+b[i]; ull ans=-1ull; ull cnt=n,x=0; for(int i=100000;i;i--) { cnt-=p[i]; ull res=0; if(A>=B) { ull d=s2[m]-s2[m-x]-x*i; res+=max(B*d,0ull); } else { ull d1=s2[m]-s2[m-x]-x*i,d2=(m-x)*i-s2[m-x]; if(d1<=d2)res+=max(d1*A,0ull); else res+=max(d2*A+(d1-d2)*B,0ull); } res+=max((cnt*i-s1[cnt])*C,0ull); x+=q[i]; ans=min(ans,res); } cout<<ans<<endl; return 0; }