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;
    }
    
  • 相关阅读:
    基于kubernetes v1.17部署dashboard:v2.0-beta8
    kubeadm快速部署Kubernetes单节点
    kafka数据可靠性深度解读
    MySql中4种批量更新的方法
    如何分析Mysql慢SQL
    企业级SSD市场接口之争:SATA会被NVMe取代吗?
    强势回归,Linux blk用实力证明自己并不弱!
    影响性能的关键部分-ceph的osd journal写
    文章汇总(包括NVMe SPDK vSAN Ceph xfs等)
    NVMe over Fabrics:概念、应用和实现
  • 原文地址:https://www.cnblogs.com/dmoransky/p/11071023.html
Copyright © 2011-2022 走看看