K Smallest Sums
| Time Limit: 1000MS |
|
Memory Limit: Unknown |
|
64bit IO Format: %lld & %llu |
[Submit]
[Go Back] [Status]
Description
Problem KK Smallest Sums
You're given k arrays, each array has k integers. There are kk ways to pick exactly one element in each array and calculate the sum of the integers. Your task is to find the k smallest sums among
them.
Input
There will be several test cases. The first line of each case contains an integer k (2<=k<=750). Each of the following k lines contains k positive integers in each array. Each of these integers does not exceed
1,000,000. The input is terminated by end-of-file (EOF). The size of input file does not exceed 5MB.
Output
For each test case, print the k smallest sums, in ascending order.
Sample Input
31 8 59 2 510 7 621 11 2
Output for the Sample Input
9 10 122 2
Rujia Liu's Present 3: A Data Structure Contest Celebrating the 100th Anniversary of Tsinghua University
Special Thanks: Yiming Li
Note: Please make sure to test your program with the gift I/O files before submitting!
將題中K組 數組,簡化成兩兩組合。每次用優先佇列儲存體K個最小數。
#include<cstdio>#include<queue>#include<algorithm>using namespace std;int a[1000][1000];int k;void merge(int id){ priority_queue<int > q; for(int i=1;i<=k;i++) q.push(a[1][i]+a[id][1]); int j=2; for(int j=1;j<=k;j++){ for(int i=2;i<=k;i++){ if(a[1][j]+a[id][i]<q.top()){ q.pop(); q.push(a[1][j]+a[id][i]); } else break; } } int l=k; while(!q.empty()){ a[1][l--]=q.top(); q.pop(); }}int main(){ while(scanf("%d",&k)!=EOF){ for(int i=1;i<=k;i++){ for(int j=1;j<=k;j++) scanf("%d",&a[i][j]); sort(a[i]+1,a[i]+1+k); } for(int i=2;i<=k;i++){ merge(i); } for(int i=1;i<k;i++) printf("%d ",a[1][i]); printf("%d\n",a[1][k]); } return 0;}