zoukankan      html  css  js  c++  java
  • loj2141 「SHOI2017」期末考试

    我们枚举每一个时间点,使得所有科目的时间都小于等于这个时间点,计算安排老师的代价和学生们的不满意度更新答案。

    但是枚举太慢了,可以发现,时间点越早,学生们不满意度越小,安排老师的代价越高。即安排老师的代价、学生们的不满意度和时间点的关系一个是负相关一个是正相关的。

    因此,安排老师的代价、学生们的不满意度的和是一个以时间点为 (x) 轴的凹函数,三分。

    #include <algorithm>
    #include <iostream>
    #include <cstdio>
    using namespace std;
    typedef long long ll;
    int A, B, n, m, t[100005], b[100005];
    ll C, ans=0x3f3f3f3f3f3f3f3f, ove, lwr;
    ll chk(int lim){
    	ll re=0;
    	ove = lwr = 0;
    	for(int i=1; i<=m; i++)
    		if(b[i]>lim)
    			ove += (ll)b[i] - lim;
    		else
    			lwr += (ll)lim - b[i];
    	if(A<=B){
    		int tmp=min(lwr, ove);
    		lwr -= tmp;
    		ove -= tmp;
    		re += (ll)tmp * A;
    		re += (ll)ove * B;
    	}
    	else	re = ove * B;
    	for(int i=1; i<=n; i++)
    		if(lim>t[i])
    			re += (ll)(lim - t[i]) * C;
    	return re;
    }
    ll sanfen(){
    	int l=0, r=100000, midl, midr, dis;
    	while(l<=r){
    		dis = (r - l + 1) / 3;
    		midl = l + dis;
    		midr = l + dis + dis;
    		ll re1=chk(midl), re2=chk(midr);
    		ans = min(ans, re1);
    		ans = min(ans, re2);
    		if(re1>re2)	l = midl + 1;
    		else	r = midr - 1;
    	}
    	return ans;
    }
    int main(){
    	cin>>A>>B>>C>>n>>m;
    	//C too large
    	int minn=0x3f3f3f3f;
    	for(int i=1; i<=n; i++){
    		scanf("%d", &t[i]);
    		minn = min(minn, t[i]);
    	}
    	for(int i=1; i<=m; i++)
    		scanf("%d", &b[i]);
    	if(C>200000){
    		cout<<chk(minn)<<endl;
    	}
    	else
    		cout<<sanfen()<<endl;
    	return 0;
    }
    

    [(mathrm{O}(n))]做法](http://blog.csdn.net/sdfzyhx/article/details/70597948)

  • 相关阅读:
    不过的小东东
    基础练习 特殊回文数
    基础练习 特殊回文数
    基础练习 特殊回文数
    web.input()与web.data()函数比较
    web.input()与web.data()函数比较
    web.input()与web.data()函数比较
    MFC 服务管理
    Fedora Documentation
    Centos7 安装vnc
  • 原文地址:https://www.cnblogs.com/poorpool/p/8568062.html
Copyright © 2011-2022 走看看