bzoj4868&&5213jzoj[Shoi2017]期末考试 枚举或三分

来源:互联网 发布:淘宝最好的饰品店 编辑:程序博客网 时间:2024/05/17 06:39

题意不能一句话,所以不写了。

训练比赛的时候手抖结果删注释的时候把下面一句更新天数的给删掉了100—>10巨亏。

还是比较好想的,枚举最后一天在什么时候,然后用前缀和来更新一下每一种方案的可行性,具体看代码。
%%%打三分的dalao们,一万年不打三分的我菜的不行。。

#include<cstdio>#include<cstring>#include<algorithm>#include<iostream>#define fo(i,a,b) for(int i=a;i<=b;i++)#define fd(i,a,b) for(int i=a;i>=b;i--)using namespace std;const int N=1e5+5;typedef long long ll;int n,m,A,B,C,k;const ll inf=1e16;ll a[N],b[N],c[N];ll cost,l,step;ll ans;int main(){    scanf("%d%d%d%d%d",&A,&B,&C,&n,&m);    fo(i,1,n)    {        int x;        scanf("%d",&x);        a[x]++,k=max(k,x);    }    fo(i,1,m)    {        int x;        scanf("%d",&x);        b[x]++;        k=max(k,x);    }    fo(i,1,k)    {        cost+=a[i]*(k-i);        l+=b[i]*(k-i);        a[i]+=a[i-1];        b[i]+=b[i-1];    }    ans=cost*C;    fd(i,k-1,1)    {        step+=(m-b[i]);        l-=b[i];        cost-=a[i];        ll p=l>0?l:0;        if(step<p)p=step;        if(A<B)ans=min(ans,p*A+(step-p)*B+cost*C);        else ans=min(ans,step*B+cost*C);    }    printf("%lld\n",ans);    return 0;}
原创粉丝点击