列表

详情


NC51031. 二分裸题

描述

n个人,每个人有一定数量的金币,现在他们要购买房子,一共有m个房子,每个房子有两个参数:舒适度和价格,当一个人的金币大于一个房子的价格时,才可以购买房子。
一个人至多购买一个房子。
一个房子至多被一个人购买。
现在xyq想知道n个人购买的房子的舒适度之和最大可能是多少?

输入描述

第一行两个整数n,m,
接下来一行n个数,第个整数x表示第i个人的金币
接下来m行每行两个整数表示每个房子的舒适度a和价格b,

输出描述

输出一个数表示最大可能的舒适度之和

示例1

输入:

2 2
2 2
2 2
2 2

输出:

4

原站题解

上次编辑到这里,代码来自缓存 点击恢复默认模板

C++ 解法, 执行用时: 136ms, 内存消耗: 1656K, 提交时间: 2022-07-20 15:09:40

#include<iostream>
#include<algorithm>
#include<queue>
using namespace std;
typedef long long int ll;
int n,m;
struct ra{
    int a,b;
    bool operator<(const ra& W) const{
        return b<W.b;
    }
}f[200010];
int w[200010];
int main(){
    cin>>n>>m;
    for(int i=1;i<=n;i++) cin>>w[i];
    for(int i=1;i<=m;i++){
        int a,b;
        cin>>a>>b;
        f[i]={a,b};
    }
    sort(w+1,w+1+n);
    sort(f+1,f+m+1);
    priority_queue<int> q;
    ll res=0;
    int j=1;
    for(int i=1;i<=n;i++){
        while(j<=m&&f[j].b<=w[i]) q.push(f[j++].a);
        if(!q.empty()){
            int t=q.top();
            q.pop();
            res+=t;
        }
    }
    cout<<res<<endl;
}

上一题