bzoj4868期末考试

Posted zcysky

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了bzoj4868期末考试相关的知识,希望对你有一定的参考价值。

我还第一次见到省选考三分……?

#include<bits/stdc++.h>
#define N 200005
using namespace std;
typedef long long ll;
int n,m,r,t[N],b[N];
ll a,B,c,ans;
ll calc(int p){
    ll x=0,y=0;
    for(int i=1;i<=m;i++)if(b[i]<p)x+=p-b[i];else y+=b[i]-p;
    return a<B?min(x,y)*a+(y-min(x,y))*B:y*B;
}
inline int read(){
    int f=1,x=0;char ch;
    do{ch=getchar();if(ch==-)f=-1;}while(ch<0||ch>9);
    do{x=x*10+ch-0;ch=getchar();}while(ch>=0&&ch<=9);
    return f*x;
}
int main(){
    cin>>a>>B>>c>>n>>m;
    for(int i=1;i<=n;i++)t[i]=read();
    for(int i=1;i<=m;i++)b[i]=read();
    sort(b+1,b+m+1);sort(t+1,t+n+1);
    if(c>=1e16)ans=calc(t[1]);
    else{
        ans=1e16;int l=1,r=N;
        while(r-l>5){
            int mid1=l+(r-l)/3,mid2=r-(r-l)/3;
            ll c1=calc(mid1),c2=calc(mid2);
            for(int i=1;i<=n;i++)if(t[i]<mid1)c1+=c*(mid1-t[i]);
            for(int i=1;i<=n;i++)if(t[i]<mid2)c2+=c*(mid2-t[i]);
            if (c1<=c2)r=mid2;else l=mid1;
        }
        for(int i=l;i<=r;i++){
            ll x=calc(i);
            for(int j=1;j<=n;j++)if(t[j]<i)x+=c*(i-t[j]);
            ans=min(ans,x);
        }
    }
    cout<<ans<<endl;
}

 

以上是关于bzoj4868期末考试的主要内容,如果未能解决你的问题,请参考以下文章

BZOJ4868期末考试 [三分][贪心]

[BZOJ4868][六省联考2017]期末考试(三分)

BZOJ4868:[SHOI2017]期末考试——题解

bzoj4868期末考试

BZOJ4868期末考试(整数三分)

BZOJ 4868 [Shoi2017]期末考试 ——三分 枚举