AcWing 127. 任务

Posted dmoransky

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了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\)\(multimap\) 恰好支持从序列中查找大于等于某数的最小值。

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

\(multimap\)\(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;

以上是关于AcWing 127. 任务的主要内容,如果未能解决你的问题,请参考以下文章

AcWing 37. 树的子结构

AcWing 791. 高精度加法 解题记录

AcWing 30. 正则表达式匹配 (剑指OFFER leetcode 10)

AcWing 803. 区间合并

AcWing 795. 前缀和

AcWing 799. 最长连续不重复子序列