洛谷 一种堆套路 P1631序列合并、P2085最小函数值
生活随笔
收集整理的這篇文章主要介紹了
洛谷 一种堆套路 P1631序列合并、P2085最小函数值
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
題目鏈接
序列合并
最小函數值
題解
這兩道題做法基本一樣,是使用同一種套路解決的,這里用序列合并來舉例說明。
序列合并要求出N2N2個和中最小的N個數。
我們用一個堆來維護我們需要的數,并且保證當前最小值一定在堆中。
把a和b排個序。
這個堆首先要加入的就是(a[1]+b[i]),1≤i≤n(a[1]+b[i]),1≤i≤n這n個數字。
這表示與b[i]b[i]所有與a[x]a[x]組合的最小值。
我們從堆中取出一個最小的并打印輸出之后,再把這個b[i]b[i]與下一個a,組合形成新的數值,并把它推入堆中。
一直取出n個元素即可。
代碼
#include <iostream> #include <cstdio> #include <vector> #include <queue> using namespace std; typedef pair<int,int> pii; const int maxn = 1e5+7; int a[maxn],b[maxn],mark[maxn]; int main(){priority_queue<pii,vector<pii>,greater<pii> >Q;int N;cin>>N;for(int i = 1;i <= N;++i)scanf("%d",&a[i]);for(int i = 1;i <= N;++i)scanf("%d",&b[i]);for(int i = 1;i <= N;++i){mark[i] = 1;Q.push(make_pair(a[1]+b[i],i));}while(N--){pii p = Q.top();Q.pop();printf("%d ",p.first);p.first = b[p.second] + a[++mark[p.second]];Q.push(p);} }總結
以上是生活随笔為你收集整理的洛谷 一种堆套路 P1631序列合并、P2085最小函数值的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 任天堂合家欢游戏《超级舞动:瓦力欧制造》
- 下一篇: codeforces gym-10174