在线测试本题
题目描述
塔子哥有 n n n 个朋友,每个朋友有一定数量的金币,现在他们要购买房子,一共有 m m m 个房子,每个房子有两个参数:舒适度和价格,当一个人的金币大于等于一个房子的价格时,才可以购买房子,且要满足以下条件:
- 一个人至多购买一个房子。
- 一个房子至多被一个人购买。
现在塔子哥想知道 n n n 个朋友购买的房子的舒适度之和最大可能是多少?
输入描述
第一行两个整数 n n n 和 m m m
接下来一行 n n n 个数,第 i i i 个整数 x x x 表示第 i i i 个人的金币 x x x, 1 ≤ x ≤ 1 0 9 1 \leq x \leq 10^9 1≤x≤109
接下来 m m m 行每行两个整数表示每个房子的舒适度 a a a 和价格 b b b, 1 ≤ a , b ≤ 1 0 9 1 \leq a, b \leq 10^9 1≤a,b≤109, 1 ≤ n , m ≤ 2 × 1 0 5 1 \leq n, m \leq 2 \times 10^5 1≤n,m≤2×105
输出描述
输出一个数表示最大可能的舒适度之和。
示例 1
输入
2 2
2 2
2 2
2 2
输出
4
题解
贪心
对于每个房子按照舒适度排序从大到小排序,对于其价格 x x x,找到所有人中持有的金币第一个 $ \ge x$ 的(用二分实现),表示最适合买当前房子的人,并将其删去即可。
在cpp中动态删除和二分的过程可以用 multiset
来实现
整体时间复杂度: O ( n log n ) O(n \log n) O(nlogn)
代码见网站内部(文章顶部):塔子哥的文字题解