题意: 给你一个二元组(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; }