1. 程式人生 > >code vs 1245 最小的N個和

code vs 1245 最小的N個和

ace define efault cnblogs http 兩個 ble 輸入一個正整數n all

1245 最小的N個和

時間限制: 1 s 空間限制: 128000 KB 題目等級 : 鉆石 Diamond 題目描述 Description

有兩個長度為 N 的序列 A 和 B,在 A 和 B 中各任取一個數可以得到 N^2 個和,求這N^2 個和中最小的 N個。

輸入描述 Input Description

第一行輸入一個正整數N;第二行N個整數Ai 且Ai≤10^9;第三行N個整數Bi,
且Bi≤10^9

輸出描述 Output Description

輸出僅一行,包含 n 個整數,從小到大輸出這 N個最小的和,相鄰數字之間用
空格隔開。

樣例輸入 Sample Input

5

1 3 2 4 5
6 3 4 1 7

樣例輸出 Sample Output

2 3 4 4 5

數據範圍及提示 Data Size & Hint

【數據規模】 對於 100%的數據,滿足 1≤N≤100000。

思路:優先隊列。

#include<queue>
#include<cstdio>
#include<cstring>
#include
<iostream> #include<algorithm> #define MAXN 200001 using namespace std; int n,num; int a[MAXN],b[MAXN]; struct nond{ int x,y; bool operator < (nond b) const{ return x>b.x; } }v; priority_queue<nond>que; int main(){ //freopen("hahaha.in","r",stdin);
//freopen("hahaha.out","w",stdout); scanf("%d",&n); for(int i=1;i<=n;i++) scanf("%d",&a[i]); sort(a+1,a+1+n); for(int i=1;i<=n;i++){ scanf("%d",&b[i]); v.x=b[i]+a[1];v.y=1; que.push(v); } while(num<n){ nond now=que.top(); cout<<now.x<<endl; que.pop(); now.x=now.x-a[now.y]+a[now.y+1]; now.y+=1; que.push(now); num++; } }

code vs 1245 最小的N個和