【SHOI&SXOI2017】bzoj4868 期末考试

来源:互联网 发布:主播助手软件 编辑:程序博客网 时间:2024/05/17 00:08

枚举最后一门考试的结束时间,用前缀和、后缀和统计需要更改的总时间和费用。
好像可以用三分做?

#include<cstdio>#include<algorithm>using namespace std;#define LL long longconst int maxn=100000;int s1[maxn+10],s2[maxn+10],sp[maxn+10],cnt[maxn+10],n,m,l,r;LL w1[maxn+10],w2[maxn+10],wp[maxn+10],a,b,c,now,ans;void solve0(){    int p;    for (int i=1;;i++)        if (sp[i])        {            p=i;            break;        }    if (w1[p]>=w2[p]) printf("%lld\n",a*w2[p]);    else printf("%lld\n",a*w1[p]+b*(w2[p]-w1[p]));}int main(){    freopen("exam.in","r",stdin);    freopen("exam.out","w",stdout);    int x;    scanf("%lld%lld%lld%d%d",&a,&b,&c,&n,&m);    a=min(a,b);    for (int i=1;i<=n;i++)    {        scanf("%d",&x);        sp[x]++;        r=max(r,x);    }    for (int i=1;i<=m;i++)    {        scanf("%d",&x);        cnt[x]++;        r=max(r,x);    }    for (int i=1;i<=r;i++)    {        sp[i]+=sp[i-1];        s1[i]=s1[i-1]+cnt[i];        wp[i]=wp[i-1]+sp[i-1];        w1[i]=w1[i-1]+s1[i-1];    }    for (int i=r;i;i--)    {        s2[i]=s2[i+1]+cnt[i];        w2[i]=w2[i+1]+s2[i+1];    }    if (c>1e12)    {        solve0();        return 0;    }    ans=1e15;    for (int i=1;i<=r;i++)    {        now=c*wp[i];        if (w1[i]>=w2[i]) now+=a*w2[i];        else now+=a*w1[i]+b*(w2[i]-w1[i]);        ans=min(ans,now);    }    printf("%lld\n",ans);    fclose(stdout);}
0 0
原创粉丝点击