有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 ...