codevs1245 最小的N個和

來源:互聯網
上載者:User

標籤:sort   i++   規模   優先   turn   href   queue   nbsp   str   

1245 最小的N個和
題目描述 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。

思路

先把兩個數組從小到大排個序

先求出a數組中每個數與b數組中第一個數的和,作為堆的初始值,建一個小根堆,以num為優先順序,y其次

由於我們不確定是a中每個數加b中最小數比較小,還是b中每個數加a中最小數比較小

所以要讓堆動起來,插入的元素就是a中當時的元素與b中下一個元素的和,每次彈出堆頂元素,重複n次即可

 

#include<iostream>#include<algorithm>#include<queue>using namespace std;int n,a[100001],b[100001];struct node{    int y,num;    bool operator <(const node &v)const    {        return num>v.num;    }};node k;priority_queue<node>q;int main(){    cin>>n;    for(int i=1;i<=n;i++)cin>>a[i];    for(int i=1;i<=n;i++)cin>>b[i];    sort(a+1,a+n+1);    sort(b+1,b+n+1);    for(int i=1;i<=n;i++)    {        k.y=1;k.num=a[i]+b[1];        q.push(k);    }    int s=1;    while(s<=n)    {        node now=q.top();        q.pop();        if(now.y+1<=n)        {            k.y=now.y+1;            k.num=now.num-b[now.y]+b[now.y+1];            q.push(k);        }s++;        cout<<now.num<<‘ ‘;    }    return 0;}

 

codevs1245 最小的N個和

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.