BZOJ4868 [Shoi2017]期末考试

来源:互联网 发布:桌面规划软件 编辑:程序博客网 时间:2024/05/29 17:30

YY一下的话感觉代价关于最晚出分时间是一个单峰函数

三分最晚的出分时间

然后贪心一下算代价就行

如果A>B就只用B就行了

要不然的话出分时间小于当前限制的都可以随便往后调直到到达限制,那么先尽量用A,调不到限制以内的再用B即可

#include<iostream>#include<cstdlib>#include<ctime>#include<cmath>#include<cstring>#include<algorithm>#include<iomanip>#include<cstdio>#include<map>#include<bitset>#include<set>#include<queue>#include<stack>#include<vector>using namespace std;#define MAXN 100010#define MAXM 1010#define eps 1e-8#define ll unsigned long long#define MOD 1000000007#define INF 1000000000ll n,m;ll a[MAXN],b[MAXN];ll now;ll A,B,C;ll ans=1e18;ll c[MAXN];ll OK(ll x){ll i;ll re=0;for(i=1;i<=n;i++){if(a[i]<x){re+=(x-a[i])*C;}}int wzh=1;if(A<B){ll rem=0;for(i=1;i<=m;i++){if(b[i]<x){rem+=x-b[i];}}for(i=1;i<=m;i++){if(b[i]>x){ll t=min(rem,b[i]-x);re+=A*t;re+=B*(b[i]-x-t);rem-=t;}}}else{for(i=1;i<=m;i++){if(b[i]>x){re+=(b[i]-x)*B;}}}return re;}int main(){ll stdans;ll i;scanf("%llu%llu%llu%llu%llu",&A,&B,&C,&n,&m);for(i=1;i<=n;i++){scanf("%llu",&a[i]);}for(i=1;i<=m;i++){scanf("%llu",&b[i]);now=max(now,b[i]);}ll l=1,r=now;//*while(r-l+1>=4){ll l1=l+(r-l+1)/3;ll l2=l+2*(r-l+1)/3;ll t1=OK(l1);ll t2=OK(l2);if(t1<=t2){r=l2;}else{l=l1;}}//*/for(i=l;i<=r;i++){ans=min(ans,OK(i));}printf("%llu\n",ans);return 0;}/**/


0 0
原创粉丝点击