NYOJ 万里挑一

阅读: 评论:0

NYOJ 万里挑一

NYOJ 万里挑一

万里挑一

时间限制: 3000 ms  |  内存限制: 65535 KB 难度: 5
描述
有两个大小为N的数组A和B,对于每一对(i, j)(0<=i,j<N)都可以得到一个数A[i]+B[j],这样就可以得到N*N个数了,你需要求出前K个大的数,easy?
输入
输入可能会有多组(小于十组),每组3行数据,第一行是两个整数N( N <= 100000 ) 和K(K<=N),接下来2行,每行N个整数,每行的整数都用空格隔开
输出
每组一行,最大的K个数,用空格隔开,从小到大输出。
样例输入
4 3
1 2 3 4
3 6 5 4
样例输出
9 9 10
来源

郑大第六届校赛

#include<iostream>
#include<algorithm>
#include<queue>
#include<vector>
#include<cstdio>
#define MAX 100005
using namespace std;
int A[MAX],B[MAX];
bool comp(const int &a,const int &b){return a>b;
}
struct cmp{bool operator()(const int &a,const int &b){//优先队列内元素由小到大排列 return a>b;}
};
int main(){int N,K;while(cin>>N>>K){priority_queue<int,vector<int>,cmp>pq;for(int i=0;i<N;i++){//cin>>A[i];scanf("%d",&A[i]);}for(int i=0;i<N;i++){//cin>>B[i];scanf("%d",&B[i]);}//程序主要思想 // 将A,B,数组由大到小排列,让A中最大的数从B中加K个数,得到的这K个数可能为 最大的K个数//然后再让A第二大的数从B中加数,若有一个小于A[i] +B[j]小于pq.top(),说明此时B中余下的数加A[i]都不会大于 pq.top(),break//若发现有大于pq.top()的数,入队 sort(A,A+N,comp),sort(B,B+N,comp);for(int i=0;i<K;i++){pq.push(A[0]+B[i]);}	for(int i=1;i<N;i++){for(int j=0;j<N;j++){int num=A[i]+B[j];if(num&p()){break;}else {pq.pop();pq.push(num);}}}while(K--){printf("%d ",pq.top());pq.pop();}}
}

sort ,与priority_queue 自定义comp的区别可以认为:

sort中按comp的中大小顺序排列数组即在comp中return a>b 则数组按由大到小排列

而priority_queue中

struct comp{
bool operator()(const int &a,const int &b){
//优先队列内元素由小到大排列 ,若由大到小排列则为<
return a>b;
}
};

与sort的comp相反

本文发布于:2024-01-30 22:25:20,感谢您对本站的认可!

本文链接:https://www.4u4v.net/it/170662472123262.html

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。

标签:万里   NYOJ
留言与评论(共有 0 条评论)
   
验证码:

Copyright ©2019-2022 Comsenz Inc.Powered by ©

网站地图1 网站地图2 网站地图3 网站地图4 网站地图5 网站地图6 网站地图7 网站地图8 网站地图9 网站地图10 网站地图11 网站地图12 网站地图13 网站地图14 网站地图15 网站地图16 网站地图17 网站地图18 网站地图19 网站地图20 网站地图21 网站地图22/a> 网站地图23