题目

给出两个包含 <math> <semantics> <mrow> <mi> n </mi> </mrow> <annotation encoding="application&#47;x&#45;tex"> n </annotation> </semantics> </math>n 个整数的数组 <math> <semantics> <mrow> <mi> A </mi> </mrow> <annotation encoding="application&#47;x&#45;tex"> A </annotation> </semantics> </math>A <math> <semantics> <mrow> <mi> B </mi> </mrow> <annotation encoding="application&#47;x&#45;tex"> B </annotation> </semantics> </math>B

分别在 <math> <semantics> <mrow> <mi> A </mi> </mrow> <annotation encoding="application&#47;x&#45;tex"> A </annotation> </semantics> </math>A, <math> <semantics> <mrow> <mi> B </mi> </mrow> <annotation encoding="application&#47;x&#45;tex"> B </annotation> </semantics> </math>B 中任意出一个数并且相加,可以得到 <math> <semantics> <mrow> <msup> <mi> n </mi> <mn> 2 </mn> </msup> </mrow> <annotation encoding="application&#47;x&#45;tex"> n^2 </annotation> </semantics> </math>n2 个和。

求这些和中最小的 <math> <semantics> <mrow> <mi> n </mi> </mrow> <annotation encoding="application&#47;x&#45;tex"> n </annotation> </semantics> </math>n 个。

输入格式

输入第一行一个整数 <math> <semantics> <mrow> <mi> n </mi> <mo> ( </mo> <mn> 1 </mn> <mo> ≤ </mo> <mi> n </mi> <mo> ≤ </mo> <mn> 50000 </mn> <mo> ) </mo> </mrow> <annotation encoding="application&#47;x&#45;tex"> n(1 \le n \le 50000) </annotation> </semantics> </math>n(1n50000)

接下来一行输入数组 <math> <semantics> <mrow> <mi> A </mi> </mrow> <annotation encoding="application&#47;x&#45;tex"> A </annotation> </semantics> </math>A,用空格隔开。

接下来一行输入数组 <math> <semantics> <mrow> <mi> B </mi> </mrow> <annotation encoding="application&#47;x&#45;tex"> B </annotation> </semantics> </math>B,用空格隔开。

<math> <semantics> <mrow> <mn> 1 </mn> <mo> ≤ </mo> <msub> <mi> A </mi> <mi> i </mi> </msub> <mo separator="true"> , </mo> <msub> <mi> B </mi> <mi> i </mi> </msub> <mo> ≤ </mo> <mn> 1 </mn> <msup> <mn> 0 </mn> <mn> 9 </mn> </msup> </mrow> <annotation encoding="application&#47;x&#45;tex"> 1 \le A_i, B_i \le 10^9 </annotation> </semantics> </math>1Ai,Bi109

输出格式

从小到大输出最小的 <math> <semantics> <mrow> <mi> n </mi> </mrow> <annotation encoding="application&#47;x&#45;tex"> n </annotation> </semantics> </math>n 个和,用空格隔开。

样例输入

4

1 3 5 7

2 4 6 8

样例输出

3 5 5 7

题解

题解一

第一种比较容易想到的方法是:存下数组 a 的值,每输入一个数组 b 的值 t,将 t 和 a 数组每个值求和放进优先队列中,最后输出优先队列中前 n 个的值

但是内存要爆,无法 AC,原因是优先队列中要存 <math> <semantics> <mrow> <msup> <mi> n </mi> <mn> 2 </mn> </msup> </mrow> <annotation encoding="application&#47;x&#45;tex"> n^2 </annotation> </semantics> </math>n2 个值

#include<iostream>
#include<algorithm>
#include<queue>
using namespace std;
int main(){
	int a[50000+5];
	priority_queue<int,vector<int>,greater<int> > sum;
	int n,t;
	int tmp;
	cin>>n;
	for(int i=0;i<n;i++)
		cin>>a[i];
	for(int i=0;i<n;i++){
		cin>>t;
		for(int j=0;j<n;j++)
			sum.push( t + a[j] );
	}
	
	for(int i=0;i<n;i++){
		tmp = sum.top();
		sum.pop();
		if(i == 0)
			cout<<tmp;
		else
			cout<<" "<<tmp;
	}
	return 0;
}

题解二

优先队列中存 <math> <semantics> <mrow> <msup> <mi> n </mi> <mn> 2 </mn> </msup> </mrow> <annotation encoding="application&#47;x&#45;tex"> n^2 </annotation> </semantics> </math>n2 个值内存要爆,那么我们想办法把优先队列中值的个数降低
单个数组有 n 个,我们就保持优先队列中值的个数为 n

假设有两个升序的数组 A,B,那么一定有:

  • A <math> <semantics> <mrow> <msub> <mn> 1 </mn> </msub> </mrow> <annotation encoding="application&#47;x&#45;tex"> _1 </annotation> </semantics> </math>1 + B <math> <semantics> <mrow> <msub> <mn> 1 </mn> </msub> </mrow> <annotation encoding="application&#47;x&#45;tex"> _1 </annotation> </semantics> </math>1 ≤ A <math> <semantics> <mrow> <msub> <mn> 1 </mn> </msub> </mrow> <annotation encoding="application&#47;x&#45;tex"> _1 </annotation> </semantics> </math>1 + B <math> <semantics> <mrow> <msub> <mn> 2 </mn> </msub> </mrow> <annotation encoding="application&#47;x&#45;tex"> _2 </annotation> </semantics> </math>2 ≤ A <math> <semantics> <mrow> <msub> <mn> 1 </mn> </msub> </mrow> <annotation encoding="application&#47;x&#45;tex"> _1 </annotation> </semantics> </math>1 + B <math> <semantics> <mrow> <msub> <mn> 3 </mn> </msub> </mrow> <annotation encoding="application&#47;x&#45;tex"> _3 </annotation> </semantics> </math>3 <math> <semantics> <mrow> <mi mathvariant="normal"> . </mi> <mi mathvariant="normal"> . </mi> <mi mathvariant="normal"> . </mi> <mi mathvariant="normal"> . </mi> <mi mathvariant="normal"> . </mi> <mi mathvariant="normal"> . </mi> </mrow> <annotation encoding="application&#47;x&#45;tex"> ...... </annotation> </semantics> </math>...... ≤ A <math> <semantics> <mrow> <msub> <mn> 1 </mn> </msub> </mrow> <annotation encoding="application&#47;x&#45;tex"> _1 </annotation> </semantics> </math>1 + B <math> <semantics> <mrow> <msub> <mi> n </mi> </msub> </mrow> <annotation encoding="application&#47;x&#45;tex"> _n </annotation> </semantics> </math>n
  • A <math> <semantics> <mrow> <msub> <mn> 2 </mn> </msub> </mrow> <annotation encoding="application&#47;x&#45;tex"> _2 </annotation> </semantics> </math>2 + B <math> <semantics> <mrow> <msub> <mn> 1 </mn> </msub> </mrow> <annotation encoding="application&#47;x&#45;tex"> _1 </annotation> </semantics> </math>1 ≤ A <math> <semantics> <mrow> <msub> <mn> 2 </mn> </msub> </mrow> <annotation encoding="application&#47;x&#45;tex"> _2 </annotation> </semantics> </math>2 + B <math> <semantics> <mrow> <msub> <mn> 2 </mn> </msub> </mrow> <annotation encoding="application&#47;x&#45;tex"> _2 </annotation> </semantics> </math>2 ≤ A <math> <semantics> <mrow> <msub> <mn> 2 </mn> </msub> </mrow> <annotation encoding="application&#47;x&#45;tex"> _2 </annotation> </semantics> </math>2 + B <math> <semantics> <mrow> <msub> <mn> 3 </mn> </msub> </mrow> <annotation encoding="application&#47;x&#45;tex"> _3 </annotation> </semantics> </math>3 <math> <semantics> <mrow> <mi mathvariant="normal"> . </mi> <mi mathvariant="normal"> . </mi> <mi mathvariant="normal"> . </mi> <mi mathvariant="normal"> . </mi> <mi mathvariant="normal"> . </mi> <mi mathvariant="normal"> . </mi> </mrow> <annotation encoding="application&#47;x&#45;tex"> ...... </annotation> </semantics> </math>...... ≤ A <math> <semantics> <mrow> <msub> <mn> 2 </mn> </msub> </mrow> <annotation encoding="application&#47;x&#45;tex"> _2 </annotation> </semantics> </math>2 + B <math> <semantics> <mrow> <msub> <mi> n </mi> </msub> </mrow> <annotation encoding="application&#47;x&#45;tex"> _n </annotation> </semantics> </math>n
  • A <math> <semantics> <mrow> <msub> <mn> 3 </mn> </msub> </mrow> <annotation encoding="application&#47;x&#45;tex"> _3 </annotation> </semantics> </math>3 + B <math> <semantics> <mrow> <msub> <mn> 1 </mn> </msub> </mrow> <annotation encoding="application&#47;x&#45;tex"> _1 </annotation> </semantics> </math>1 ≤ A <math> <semantics> <mrow> <msub> <mn> 3 </mn> </msub> </mrow> <annotation encoding="application&#47;x&#45;tex"> _3 </annotation> </semantics> </math>3 + B <math> <semantics> <mrow> <msub> <mn> 2 </mn> </msub> </mrow> <annotation encoding="application&#47;x&#45;tex"> _2 </annotation> </semantics> </math>2 ≤ A <math> <semantics> <mrow> <msub> <mn> 3 </mn> </msub> </mrow> <annotation encoding="application&#47;x&#45;tex"> _3 </annotation> </semantics> </math>3 + B <math> <semantics> <mrow> <msub> <mn> 3 </mn> </msub> </mrow> <annotation encoding="application&#47;x&#45;tex"> _3 </annotation> </semantics> </math>3 <math> <semantics> <mrow> <mi mathvariant="normal"> . </mi> <mi mathvariant="normal"> . </mi> <mi mathvariant="normal"> . </mi> <mi mathvariant="normal"> . </mi> <mi mathvariant="normal"> . </mi> <mi mathvariant="normal"> . </mi> </mrow> <annotation encoding="application&#47;x&#45;tex"> ...... </annotation> </semantics> </math>...... ≤ A <math> <semantics> <mrow> <msub> <mn> 3 </mn> </msub> </mrow> <annotation encoding="application&#47;x&#45;tex"> _3 </annotation> </semantics> </math>3 + B <math> <semantics> <mrow> <msub> <mi> n </mi> </msub> </mrow> <annotation encoding="application&#47;x&#45;tex"> _n </annotation> </semantics> </math>n
  • <math> <semantics> <mrow> <mi mathvariant="normal"> . </mi> <mi mathvariant="normal"> . </mi> <mi mathvariant="normal"> . </mi> <mi mathvariant="normal"> . </mi> <mi mathvariant="normal"> . </mi> <mi mathvariant="normal"> . </mi> </mrow> <annotation encoding="application&#47;x&#45;tex"> ...... </annotation> </semantics> </math>......
  • A <math> <semantics> <mrow> <msub> <mi> n </mi> </msub> </mrow> <annotation encoding="application&#47;x&#45;tex"> _n </annotation> </semantics> </math>n + B <math> <semantics> <mrow> <msub> <mn> 1 </mn> </msub> </mrow> <annotation encoding="application&#47;x&#45;tex"> _1 </annotation> </semantics> </math>1 ≤ A <math> <semantics> <mrow> <msub> <mi> n </mi> </msub> </mrow> <annotation encoding="application&#47;x&#45;tex"> _n </annotation> </semantics> </math>n + B <math> <semantics> <mrow> <msub> <mn> 2 </mn> </msub> </mrow> <annotation encoding="application&#47;x&#45;tex"> _2 </annotation> </semantics> </math>2 ≤ A <math> <semantics> <mrow> <msub> <mi> n </mi> </msub> </mrow> <annotation encoding="application&#47;x&#45;tex"> _n </annotation> </semantics> </math>n + B <math> <semantics> <mrow> <msub> <mn> 3 </mn> </msub> </mrow> <annotation encoding="application&#47;x&#45;tex"> _3 </annotation> </semantics> </math>3 <math> <semantics> <mrow> <mi mathvariant="normal"> . </mi> <mi mathvariant="normal"> . </mi> <mi mathvariant="normal"> . </mi> <mi mathvariant="normal"> . </mi> <mi mathvariant="normal"> . </mi> <mi mathvariant="normal"> . </mi> </mrow> <annotation encoding="application&#47;x&#45;tex"> ...... </annotation> </semantics> </math>...... ≤ A <math> <semantics> <mrow> <msub> <mi> n </mi> </msub> </mrow> <annotation encoding="application&#47;x&#45;tex"> _n </annotation> </semantics> </math>n + B <math> <semantics> <mrow> <msub> <mi> n </mi> </msub> </mrow> <annotation encoding="application&#47;x&#45;tex"> _n </annotation> </semantics> </math>n

此时,横向看随着 B 下标的增加,和值不断增大,竖向看随着 A 下标的增加,和值也不断增大

所以我们可以:

  1. 读取 A B 数组并排序
  2. 将 A[0] + B[0] 到 A[0] + B[n] 的和值加入优先队列中(此时优先队列中最小的值,肯定是所有和值里最小的)
  3. 开始出队,并入队和值的下一组,比如第一次出队的和值肯定是 A[0] + B[0],那么我们入队 A[1] + B[0] (A[1] + B[0] 和 A[0] + B[1] 接近 A[0] + B[0],而后者已经在优先队列中了)
#include<iostream>
#include<algorithm>
#include<queue>
#include<vector>
using namespace std;
struct node{
	int sum;
	int a;
	int b;
	bool operator<(const node &A)const{
		return sum > A.sum; 
	}
};
int main(){
	vector<int> a;
	vector<int> b;
	priority_queue<node> sum;
	int n,t;
	node tmp;
	cin>>n;
	for(int i=0;i<n;i++){
		cin>>t;
		a.push_back(t);
	}
	sort(a.begin(),a.end());
	for(int i=0;i<n;i++){
		cin>>t;
		b.push_back(t);
	}
	sort(b.begin(),b.end());
	for(int i=0;i<n;i++){
		tmp.a = 0;
		tmp.b = i;
		tmp.sum = a[tmp.a] + b[tmp.b];
		sum.push(tmp);
	}
	for(int i=0;i<n;i++){
		tmp = sum.top();
		sum.pop();
		if(i == 0)
			cout<<tmp.sum;
		else
			cout<<" "<<tmp.sum;
		tmp.a++;
		tmp.sum = a[tmp.a] + b[tmp.b];
		sum.push(tmp);
	}
	return 0;
}

返回目录,查看更多