题目
给出两个包含 <math> <semantics> <mrow> <mi> n </mi> </mrow> <annotation encoding="application/x-tex"> n </annotation> </semantics> </math>n 个整数的数组 <math> <semantics> <mrow> <mi> A </mi> </mrow> <annotation encoding="application/x-tex"> A </annotation> </semantics> </math>A, <math> <semantics> <mrow> <mi> B </mi> </mrow> <annotation encoding="application/x-tex"> B </annotation> </semantics> </math>B。
分别在 <math> <semantics> <mrow> <mi> A </mi> </mrow> <annotation encoding="application/x-tex"> A </annotation> </semantics> </math>A, <math> <semantics> <mrow> <mi> B </mi> </mrow> <annotation encoding="application/x-tex"> B </annotation> </semantics> </math>B 中任意出一个数并且相加,可以得到 <math> <semantics> <mrow> <msup> <mi> n </mi> <mn> 2 </mn> </msup> </mrow> <annotation encoding="application/x-tex"> n^2 </annotation> </semantics> </math>n2 个和。
求这些和中最小的 <math> <semantics> <mrow> <mi> n </mi> </mrow> <annotation encoding="application/x-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/x-tex"> n(1 \le n \le 50000) </annotation> </semantics> </math>n(1≤n≤50000)。
接下来一行输入数组 <math> <semantics> <mrow> <mi> A </mi> </mrow> <annotation encoding="application/x-tex"> A </annotation> </semantics> </math>A,用空格隔开。
接下来一行输入数组 <math> <semantics> <mrow> <mi> B </mi> </mrow> <annotation encoding="application/x-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/x-tex"> 1 \le A_i, B_i \le 10^9 </annotation> </semantics> </math>1≤Ai,Bi≤109
输出格式
从小到大输出最小的 <math> <semantics> <mrow> <mi> n </mi> </mrow> <annotation encoding="application/x-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/x-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/x-tex"> n^2 </annotation> </semantics> </math>n2 个值内存要爆,那么我们想办法把优先队列中值的个数降低
单个数组有 n 个,我们就保持优先队列中值的个数为 n
假设有两个升序的数组 A,B,那么一定有:
- A <math> <semantics> <mrow> <msub> <mn> 1 </mn> </msub> </mrow> <annotation encoding="application/x-tex"> _1 </annotation> </semantics> </math>1 + B <math> <semantics> <mrow> <msub> <mn> 1 </mn> </msub> </mrow> <annotation encoding="application/x-tex"> _1 </annotation> </semantics> </math>1 ≤ A <math> <semantics> <mrow> <msub> <mn> 1 </mn> </msub> </mrow> <annotation encoding="application/x-tex"> _1 </annotation> </semantics> </math>1 + B <math> <semantics> <mrow> <msub> <mn> 2 </mn> </msub> </mrow> <annotation encoding="application/x-tex"> _2 </annotation> </semantics> </math>2 ≤ A <math> <semantics> <mrow> <msub> <mn> 1 </mn> </msub> </mrow> <annotation encoding="application/x-tex"> _1 </annotation> </semantics> </math>1 + B <math> <semantics> <mrow> <msub> <mn> 3 </mn> </msub> </mrow> <annotation encoding="application/x-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/x-tex"> ...... </annotation> </semantics> </math>...... ≤ A <math> <semantics> <mrow> <msub> <mn> 1 </mn> </msub> </mrow> <annotation encoding="application/x-tex"> _1 </annotation> </semantics> </math>1 + B <math> <semantics> <mrow> <msub> <mi> n </mi> </msub> </mrow> <annotation encoding="application/x-tex"> _n </annotation> </semantics> </math>n
- A <math> <semantics> <mrow> <msub> <mn> 2 </mn> </msub> </mrow> <annotation encoding="application/x-tex"> _2 </annotation> </semantics> </math>2 + B <math> <semantics> <mrow> <msub> <mn> 1 </mn> </msub> </mrow> <annotation encoding="application/x-tex"> _1 </annotation> </semantics> </math>1 ≤ A <math> <semantics> <mrow> <msub> <mn> 2 </mn> </msub> </mrow> <annotation encoding="application/x-tex"> _2 </annotation> </semantics> </math>2 + B <math> <semantics> <mrow> <msub> <mn> 2 </mn> </msub> </mrow> <annotation encoding="application/x-tex"> _2 </annotation> </semantics> </math>2 ≤ A <math> <semantics> <mrow> <msub> <mn> 2 </mn> </msub> </mrow> <annotation encoding="application/x-tex"> _2 </annotation> </semantics> </math>2 + B <math> <semantics> <mrow> <msub> <mn> 3 </mn> </msub> </mrow> <annotation encoding="application/x-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/x-tex"> ...... </annotation> </semantics> </math>...... ≤ A <math> <semantics> <mrow> <msub> <mn> 2 </mn> </msub> </mrow> <annotation encoding="application/x-tex"> _2 </annotation> </semantics> </math>2 + B <math> <semantics> <mrow> <msub> <mi> n </mi> </msub> </mrow> <annotation encoding="application/x-tex"> _n </annotation> </semantics> </math>n
- A <math> <semantics> <mrow> <msub> <mn> 3 </mn> </msub> </mrow> <annotation encoding="application/x-tex"> _3 </annotation> </semantics> </math>3 + B <math> <semantics> <mrow> <msub> <mn> 1 </mn> </msub> </mrow> <annotation encoding="application/x-tex"> _1 </annotation> </semantics> </math>1 ≤ A <math> <semantics> <mrow> <msub> <mn> 3 </mn> </msub> </mrow> <annotation encoding="application/x-tex"> _3 </annotation> </semantics> </math>3 + B <math> <semantics> <mrow> <msub> <mn> 2 </mn> </msub> </mrow> <annotation encoding="application/x-tex"> _2 </annotation> </semantics> </math>2 ≤ A <math> <semantics> <mrow> <msub> <mn> 3 </mn> </msub> </mrow> <annotation encoding="application/x-tex"> _3 </annotation> </semantics> </math>3 + B <math> <semantics> <mrow> <msub> <mn> 3 </mn> </msub> </mrow> <annotation encoding="application/x-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/x-tex"> ...... </annotation> </semantics> </math>...... ≤ A <math> <semantics> <mrow> <msub> <mn> 3 </mn> </msub> </mrow> <annotation encoding="application/x-tex"> _3 </annotation> </semantics> </math>3 + B <math> <semantics> <mrow> <msub> <mi> n </mi> </msub> </mrow> <annotation encoding="application/x-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/x-tex"> ...... </annotation> </semantics> </math>......
- A <math> <semantics> <mrow> <msub> <mi> n </mi> </msub> </mrow> <annotation encoding="application/x-tex"> _n </annotation> </semantics> </math>n + B <math> <semantics> <mrow> <msub> <mn> 1 </mn> </msub> </mrow> <annotation encoding="application/x-tex"> _1 </annotation> </semantics> </math>1 ≤ A <math> <semantics> <mrow> <msub> <mi> n </mi> </msub> </mrow> <annotation encoding="application/x-tex"> _n </annotation> </semantics> </math>n + B <math> <semantics> <mrow> <msub> <mn> 2 </mn> </msub> </mrow> <annotation encoding="application/x-tex"> _2 </annotation> </semantics> </math>2 ≤ A <math> <semantics> <mrow> <msub> <mi> n </mi> </msub> </mrow> <annotation encoding="application/x-tex"> _n </annotation> </semantics> </math>n + B <math> <semantics> <mrow> <msub> <mn> 3 </mn> </msub> </mrow> <annotation encoding="application/x-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/x-tex"> ...... </annotation> </semantics> </math>...... ≤ A <math> <semantics> <mrow> <msub> <mi> n </mi> </msub> </mrow> <annotation encoding="application/x-tex"> _n </annotation> </semantics> </math>n + B <math> <semantics> <mrow> <msub> <mi> n </mi> </msub> </mrow> <annotation encoding="application/x-tex"> _n </annotation> </semantics> </math>n
此时,横向看随着 B 下标的增加,和值不断增大,竖向看随着 A 下标的增加,和值也不断增大
所以我们可以:
- 读取 A B 数组并排序
- 将 A[0] + B[0] 到 A[0] + B[n] 的和值加入优先队列中(此时优先队列中最小的值,肯定是所有和值里最小的)
- 开始出队,并入队和值的下一组,比如第一次出队的和值肯定是 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;
}