时间限制:C/C++ 1秒,其他语言2秒
空间限制:C/C++ 262144K,其他语言524288K
64bit IO Format: %lld
题目描述
小猫在研究二元组。
小猫在研究最大值。
给定N个二元组(a1,b1),(a2,b2),…,(aN,bN),请你从中选出恰好K个,使得ai的最小值与bi的最小值之和最大。
请输出ai的最小值与bi的最小值之和
输入描述:
第一行两个正整数N,K,表示二元组数量与需要选的数量。
接下来N行,第i行两个正整数ai,bi。
输出描述:
一行一个正整数,表示最大的a_i的最小值与b_i的最小值之和。
示例1
输入
3 2
1 1
2 3
3 1
输出
3
备注:
1≤N≤105,1≤ai,bi≤109
#include <bits/stdc++.h>
using namespace std;
const int N=1e5+5;
struct node{
int a,b;
}t[N];
bool cmp(node x,node y){//按二元组的a降序对二元组排序
return x.a>y.a;
}
priority_queue<int,vector<int>,greater<int> >q;//定义一个优先弹出最小整数的优先队列
int main(){
int n,k;
scanf("%d %d",&n,&k);
for(int i=0;i<n;i++){
scanf("%d %d",&t[i].a,&t[i].b);
}
sort(t,t+n,cmp);
int ans=-1;
/*二元组排为按a降序,则当前i的a即为最小的a,
当队列大小第一次等于k时,t[i].a即为k组二元组中最大的最小的a,
因为i往后循环a的值只会越来越小(或不变),再加上q队头的元素b即为k组a+b的最小值。
下一组最优解(如果有)一定是a小于当前最优解的a,而b大于当前最优解的b,
因为当前最优解的b一定已被弹出,即当队列的大小大于k时,将队头元素弹出。*/
for(int i=0;i<n;i++){
q.push(t[i].b);
if(q.size()>k){
q.pop();
}
if(q.size()==k){
ans=max(ans,q.top()+t[i].a);
}
}
printf("%d\n",ans);
return 0;
}