zoukankan      html  css  js  c++  java
  • AcWing 127. 任务

    题目链接

    参考y神的思路QWQ

    算法:贪心

    对于每一个任务:

    • (y) 的差异最多能使利润(w)浮动(2 * 100 = 200)元。
    • (x)(1),则会使利润(w)浮动(500)

    所以,(y)对利润的影响较小,(x)与其利润(w)的关系成对应关系(即(x_{i} < x_{j}),则(w_{i}<w_{j}),仅当(x_{i} = x_{j}),再按照(y)考虑即可。

    策略可以变成(x)从大到小的顺序考虑每一个任务,如果能匹配机器,则从能匹配的机器中选择机器(y)最小的一个。

    匹配机器

    1. 先用(x)分别从大到小排序任务与机器。
    2. 对于每一个任务,把时间充足的机器放入集合中。
    3. 若存在,从集合中找出级别最低的机器使用,并且从集合中删除那个机器。

    这种处理顺序可以保证:在处理第下一个任务时,集合中的机器时间都是充足的。且找机器的时间复杂度处于(O(M+N))级别。
    (STL)(multiset) 恰好支持从序列中查找大于等于某数的最小值。

    时间复杂度:O(MlogN + N)

    (multiset)(lowerbound) 时间为(O(logN))的...

    #include<cstdio>
    #include<iostream>
    #include<algorithm>
    #include<set>
    using namespace std;
    typedef pair<int,int> PII;
    
    const int N = 100000 + 10;
    int n, m;
    PII a[N],b[N];
    int main(){
    	while(cin >> n >> m){
    		for(int i = 1; i <= n; i++) cin >> a[i].first >> a[i].second;
    		for(int i = 1; i <= m; i++) cin >> b[i].first >> b[i].second;
    		
    		sort(a + 1,a + 1 + n); sort(b + 1,b + 1 + m);
    		
    		multiset<int> s; s.clear();
    		long long cnt = 0, ans = 0;
    		for(int i = m, j = n; i >= 1; i--){
    			//将时间足够的机器放到set中 
    			while(j >= 1 && b[i].first <= a[j].first)s.insert(a[j--].second);
    
    			multiset<int>::iterator it = s.lower_bound(b[i].second);
    			if(it != s.end()){
    				cnt ++;
    				ans += 500 * b[i].first + 2 * b[i].second;
    				s.erase(it);
    			}
    		}
    		cout << cnt << " " << ans << endl;
    	}
    	return 0;
    }
    
  • 相关阅读:
    工作总结(二):Web Design
    工作总结(一):Linux C
    三十分钟学会AWK
    MySQL并发复制系列二:多线程复制 2016
    修改MySQL 5.7.9版本的root密码方法以及一些新变化整理
    sync_binlog innodb_flush_log_at_trx_commit 浅析
    MariaDB的"response time"插件
    Python学习九:列表生成式
    python中的深拷贝和浅拷贝理解
    Mycat 配置
  • 原文地址:https://www.cnblogs.com/dmoransky/p/11071023.html
Copyright © 2011-2022 走看看