题目大意:有m门课,第i门课的出成绩时间为t[i]。
假设max{t[i]}=T。
有n个人,第i个人期望的最晚出成绩时间为w[i],如果T>w[i],那么这个人就贡献(T-w[i])*C的代价。
有2个操作:
(1)选择x,y,然后++t[x],–t[y],花费A的代价。
(2)选择x,然后–t[x],花费B的代价。
给定n,m,t[],w[],A,B,C,求最小代价。
题解:1.一堆线性函数的和还是线性函数,可以三分T
2.
我的收获:2333
#include <bits/stdc++.h>
using namespace std;
#define ll long long
#define N 100007
int n,m;
ll t[N],b[N],s1[N],s2[N];
ll mx,A,B,C,ans=1e15;
void work()
{
if(C>1e10) mx=t[1];
for(ll i=1,j=0,k=0;i<=mx;i++)
{
while(j<n&&t[j+1]<i) j++;
while(k<m&&b[k+1]<i) k++;
ll cnt1=i*k-s2[k],cnt2=s2[m]-s2[k]-i*(m-k),c1=C*(i*j-s1[j]);
ll c2=(B<=A)?B*cnt2:min(cnt1,cnt2)*A+max(0ll,cnt2-cnt1)*B;
ans=min(ans,c1+c2);
}
cout<<ans<<endl;
}
void init()
{
scanf("%lld%lld%lld",&A,&B,&C);
scanf("%d%d",&n,&m);
for(int i=1;i<=n;i++) scanf("%lld",&t[i]),mx=max(mx,t[i]);
for(int i=1;i<=m;i++) scanf("%lld",&b[i]),mx=max(mx,b[i]);
sort(t+1,t+1+n);sort(b+1,b+1+m);
for(int i=1;i<=n;i++) s1[i]=s1[i-1]+t[i];
for(int i=1;i<=m;i++) s2[i]=s2[i-1]+b[i];
}
int main()
{
init();
work();
return 0;
}