UVA11997 K個最小和 優先佇列 K路合併

2021-07-09 08:06:46 字數 1178 閱讀 9289

有k個整數陣列,包含k個元素。在每個陣列中取乙個元素加起來,可以得到k^k個和。求這些和中最小的k個值

分析:這題有簡化版本的,即2個整數陣列a,b,包含k個元素,在每個陣列中取乙個元素加起來,可以得到k^2個和,求這些和中最小的k個值。

我們需要把這k^2個和組織成如下k個有序表.

表1:a1+b1<=a1+b2<=......<=a1+bk

表2: a2+b1<=a2+b2<=......<=a2+bk

表k:ak+b1<=ak+b2<=......<=ak+bk

我們可以用二元組(s,b)來表示乙個元素即s=aa+bb;為什麼不儲存a的下標a呢?因為我們用不到a的值。如果我們需要元素(s,b)在表a的下乙個元素(s',b+1).只需要計算s'=s+b[b+1]-b[b];

這樣我們先將k個表的第乙個元素壓入優先佇列,這樣佇列中就用k個元素了。然後從佇列中出乙個值,就壓入這個值所在表的下乙個元素,直到k個值都出了優先佇列。這樣就得到k個最小值了。。

然後對與k個陣列。我們只需兩兩合併即可。

#include #include #include #include using namespace std;

const int max=770;

int store[max][max];

typedef struct _node

}node;

void merge(int *a,int *b,int *c,int k)

{ priority_queue pq;

node temp;

int i,j=0;

int sum;

int pos;

/* a[1]+b[1], a[1]+b[2] ,a[1]+b[3], a[1]+b[k]

a[2]+b[1], a[2]+b[2] ,a[2]+b[3], a[2]+b[k]

a[3]+b[1], a[3]+b[2] ,a[3]+b[3], a[3]+b[k]

a[k]+b[1], a[k]+b[2] ,a[k]+b[3], a[k]+b[k]

如果給我們兩個陣列,讓我們求前k個最小和則構建如上矩陣

這是乙個k*k的矩陣,我們在求解過程中首先將前一列壓入優先佇列,然後取出頂部元素,找到其下標,如果下標是x,則代表x行的元素是其目前最小元素,我們將其後面的元素壓入優先佇列

*/ for(i=0;i

uva11997 k個最小和

乙個k k的矩陣,每行選取乙個數相加則得到乙個和,求最小的前k個和。k 750 已知前m行最小的前k個和d 1 d k 則前m 1行最小的前k個和都必定是d i i k a m 1 x 排序,列舉x,用優先佇列處理。學會了個小技巧 node形式的優先佇列,想直接插入元素組成node struct n...

uva11997 k個最小和

乙個k k的矩陣,每行選取乙個數相加則得到乙個和,求最小的前k個和。k 750 已知前m行最小的前k個和d 1 d k 則前m 1行最小的前k個和都必定是d i i k a m 1 x 排序,列舉x,用優先佇列處理。學會了個小技巧 node形式的優先佇列,想直接插入元素組成node struct n...

P3765k個最小和

問題描述 有k個整數陣列,各包含k個元素,從每個陣列中選取乙個元素加起來,可以得到k k個和,求這些和中最小的k個值。輸入格式 第一行,乙個整數k k 500 接下來k行,每行k個正整數 1000000 輸出格式 一行,k個有小到大排列的整數,表示最小的k個和 樣例輸入 1 3 1 8 5 9 2 ...