桂林电子科技大学第三届ACM程序设计竞赛 二元 贪心

时间限制: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;
}

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值