这个题感觉以前做过类似的,不过忘记了,优先队列真是没想到,又学习到新知识了
解题思路:
- 这个题感觉主要是思维吧,主要是怎么处理这个最小值
- 首先想个简单了,只有一个数组,我们选出k个,选出最小值的最大
- 那么我们从大到小排序,那么第k个就是最小值中最大的
- 然后如果有2个数组,我们怎么处理(结构体)
- 首先第一个我们还是那么处理,不过到k的时候我们就会取值,然后我们删除前面一个值,那么当前的点(只要是>= k)就是 a 的最小值的最大值,那么另一个值b,我们放入优先队列里,从小到大排序,这样我们删除的话,我们肯定是删除最小的,然后我们取出的也是最小的,也是最小值的最大值(当前),然后我们就继续遍历,求出最大值。
相关代码:
#include <cstdio>
#include <queue>
#include <iostream>
#include <algorithm>
using namespace std;
const int N = 100010;
struct node
{
int x, y;
}a[N];
bool cmp(node xx, node yy){
return xx.x > yy.x;
}
int main(){
int n, k;
scanf("%d%d",&n,&k);
for (int i = 0; i < n; i ++){
scanf("%d%d",&a[i].x,&a[i].y);
}
int res = 0;
sort(a, a + n, cmp);
priority_queue< int,vector<int>,greater<int> > q;
for (int i = 0; i < n; i ++){
q.push(a[i].y);
if(q.size() > k){
q.pop();
}
if (q.size() == k){
res = max(res, q.top() + a[i].x);
}
}
printf("%d\n",res);
return 0;
}