二元数组的最小值最大和

题意: 给你一个二元组(a1,b1)(a[2],b[2]).......(a[n],b[n]),让你从这n个二元组中选出K个,使得a[i] ,b[i]的最小值的和最大

 n<=1e5+5;a[i],b[i]<=1e9;

思路:排序加优先队列

首先对a[i]进行从大到小排序,然后遍历数组 a 数组,很明显依次遍历过来取得a[i]一定是最小值的最大,但如何保证b[i]的最小值最大呢,可以用优先队列(较小者先出),当队列大小为k时,我们弹出一个最小值,同时更新答案,并将其删除。因为每次都会更新答案,所以你再加入进来的b[i]无论大小如何,都有可能进行答案的更新。

#include<bits/stdc++.h>
#define ll long long
#define pii pair<int,int>
#define mem(a,b) memset(a,b,sizeof(a))
using namespace std;
const int maxn=1e5+5;
const int inf=1e9+7;

pii a[maxn];
bool cmp(pii A,pii B){if(A.first==B.first)return A.second>B.second;else return A.first>B.first;}
priority_queue<int,vector<int>,greater<int> >q;
int main()
{
    int n,k;
    cin>>n>>k;
    for(int i=1;i<=n;i++){
        scanf("%d%d",&a[i].first,&a[i].second);
    }
    sort(a+1,a+1+n,cmp);
    int ans=0;
    for(int i=1;i<=n;i++){
        q.push(a[i].second);
        if(q.size()==k){
            ans=max(ans,q.top()+a[i].first);
            q.pop();
        }
    }
    cout<<ans<<endl;
    return 0;
}
posted @ 2020-01-04 16:19  sj-_-js  阅读(221)  评论(0编辑  收藏  举报