zoukankan      html  css  js  c++  java
  • 【题解】期末考试 六省联考 2017 洛谷 P3745 BZOJ 4868 贪心 三分

    题目传送门:这里是萌萌哒传送门(>,<)
    啊♀,据说这题有个完全贪心的做法,但是要维护太多东西好麻烦的(>,<),于是就来口胡一发三分的做法。
    思路很简单,假设我指定了一个x,要求通过调整,所有的成绩都最迟在第x天出。
    调整到第x天的代价是很容易通过贪心计算出来的啦,复杂度线性。
    然后我们考虑从大到小枚举x,每次计算出代价之后更新答案。
    再然后我们大胆猜想这是一个单峰函数!
    既然都单峰啦那直接三分就好啦(>,<)。
    实际上我不知道它是不是真的是单峰函数。。。但是就AC了。。。
    如果这个做法能被叉掉的话欢迎dalao来叉♀啦,求轻虐。。。

    #include <cstring>
    #include <algorithm>
    #include <cstdio>
    
    using namespace std;
    typedef long long ll;
    const ll INFLL = 0x3f3f3f3f3f3f3f3fLL;
    const int MAXN = 100010;
    const int MAXM = 100010;
    
    ll A, B, C;
    int n, m, t[MAXN], b[MAXM];
    
    void input() {
    	scanf( "%lld%lld%lld", &A, &B, &C );
            scanf( "%d%d", &n, &m );
    	for( int i = 0; i < n; ++i ) scanf( "%d", t+i );
    	for( int i = 0; i < m; ++i ) scanf( "%d", b+i );
    }
    
    ll f( int lim ) { // 贪心计算最迟在第lim天出所有成绩的最小代价
    	ll y = 0;
    	ll left = 0, extra = 0;
    	for( int i = 0; i < n; ++i )
    		if( lim > t[i] ) y += (lim - t[i])*C;
    	for( int i = 0; i < m; ++i ) {
    		if( b[i] < lim ) left += lim - b[i];
    		else extra += b[i] - lim;
    	}
    	A = min(A, B);
    	left = min(left, extra);
    	y += left*A + (extra - left)*B;
    	return y;
    }
    
    void solve() { // 三分
    	int low = *min_element(t, t+n);
    	int high = *max_element(b, b+m);
    	ll ans = INFLL;
    	while( high-low >= 4 ) {
    	    int lm = low + (high-low)/3;
    		int rm = high - (high-low)/3;
    		if( f(lm) < f(rm) ) high = rm;
    		else low = lm;
    	}
    	for( int i = low; i <= high; ++i )
    		ans = min(ans, f(i));
    	printf( "%lld
    ", ans );
    }
    
    void solve2() { // 对于C=1e16的特殊数据,必须要满足所有学生的需求
    	int lim = *min_element(t, t+n);
    	ll left = 0, extra = 0;
    	for( int i = 0; i < m; ++i ) {
    		if( b[i] < lim ) left += lim - b[i];
    		else extra += b[i] - lim;
    	}
    	A = min(A, B);
    	left = min(left, extra);
    	ll ans = left*A + (extra - left)*B;
    	printf( "%lld
    ", ans );
    }
    
    int main() {
    	input();
    	if( C == ll(1e16) ) solve2();
    	else solve();
    	return 0;
    }
    
    
  • 相关阅读:
    Jquery 复习练习(01)
    web前段 弹出小例子
    MacBook 显示隐藏文件夹命令
    sqlserver 纵横
    C#获取当前页面的url
    C# Json 转对象
    jquery导航栏
    AJAX
    hao dongxi
    微信网页获取openId
  • 原文地址:https://www.cnblogs.com/mlystdcall/p/6920015.html
Copyright © 2011-2022 走看看