hdu4864 贪心+平衡二叉搜索树(map)

题意

  • n个机器,m个任务,每个机器最多做一个任务,每个任务最多被一台机器做
  • 每个机器和任务有两个属性,x和y,机器这两个属性都分别大于等于任务的这两个属性时才可做该任务。
  • 问最多能做多少任务。
  • 另外,一个任务完成挣500x+2y的钱数,在任务数达到最多的前提下,问你挣得最多的钱数。

思路

  • 贪心,把任务和机器分别按两个属性从大到小排序,x是第一优先级,y是第二
  • 遍历任务和机器,对每个任务,所有机器的x满足条件的,就把机器的y值作为key放入到map中,如果map里已存在该值,则让该值++,当发现下一个机器的x不满足或者机器都遍历结束了,我们从map中找到键值大于等于机器y值最小的让这个机器完成该任务。

实现

#include <iostream>
#include <cstring>
#include <map>
#include <vector>
#include <cstdio>
#include <algorithm>
using namespace std;
#define fi first
#define se second
#define mp make_pair
#define pb push_back
typedef long long ll;
typedef pair<int,int> pii;
const int maxn = 100005;
pii mash[maxn], task[maxn];
vector<int> vec;
map<int,int> mapp;
map<int,int>::iterator iter;

int main(){
    int n,m;
    while (scanf("%d%d",&n,&m) != EOF){
        vec.clear();
        mapp.clear();
        for (int i=0;i<n;i++){
            scanf("%d%d",&mash[i].fi,&mash[i].se);
        }
        for (int i=0;i<m;i++){
            scanf("%d%d",&task[i].fi,&task[i].se);
        }
        sort(mash,mash+n);
        sort(task,task+m);

        for (int i=n-1,j=m-1;j>=0;){
            if (i >= 0 && mash[i].fi >= task[j].fi){
                mapp[mash[i].se]++;
                i--;
            }
            else{
                if (mapp.size() == 0){
                    j--;
                    continue;
                }
                iter = mapp.lower_bound(task[j].se);
                if (iter == mapp.end()){
                    j--;
                    continue;
                }
                vec.pb(j);
                if (iter->se == 1){
                    mapp.erase(iter);
                }
                else{
                    iter->se--;
                }
                j--;
            }
        }
        ll ans = 0;
        for (int i=0;i<vec.size();i++){
            int id = vec[i];
            ans += (ll)500 * (ll)task[id].fi + (ll)2 * (ll)task[id].se;
        }
        cout << vec.size() <<" " << ans <<'\n';
    }

    return 0;
}
    原文作者:平衡二叉树
    原文地址: https://blog.csdn.net/luke2834/article/details/50223167
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞