POJ 2442 Sequence

Given m sequences, each contains n non-negative integer. Now we may select one number from each sequence to form a sequence with m integers. It's clear that we may get n ^ m this kind of sequences. Then we can calculate the sum of numbers in each sequence, and get n ^ m values. What we need is the smallest n sums. Could you help us?

Input

The first line is an integer T, which shows the number of test cases, and then T test cases follow. The first line of each case contains two integers m, n (0 < m <= 100, 0 < n <= 2000). The following m lines indicate the m sequence respectively. No integer in the sequence is greater than 10000.

Output

For each test case, print a line with the smallest n sums in increasing order, which is separated by a space.

Sample Input

1
2 3
1 2 3
2 2 3

Sample Output

3 3 4

思路:每次找出前两个序列的前n大,然后将这前n大当成新的序列与第三行处理,以此类推。取出堆顶元素的下标为(i, j)时,将(i, j + 1)与(i + 1, j)加入决策集。复杂度nmlogn.
  1 #include <iostream>
  2 #include <fstream>
  3 #include <sstream>
  4 #include <cstdlib>
  5 #include <cstdio>
  6 #include <cmath>
  7 #include <string>
  8 #include <cstring>
  9 #include <algorithm>
 10 #include <queue>
 11 #include <stack>
 12 #include <vector>
 13 #include <set>
 14 #include <map>
 15 #include <list>
 16 #include <iomanip>
 17 #include <cctype>
 18 #include <cassert>
 19 #include <bitset>
 20 #include <ctime>
 21 
 22 using namespace std;
 23 
 24 #define pau system("pause")
 25 #define ll long long
 26 #define pii pair<int, int>
 27 #define pb push_back
 28 #define mp make_pair
 29 #define clr(a, x) memset(a, x, sizeof(a))
 30 
 31 const double pi = acos(-1.0);
 32 const int INF = 0x3f3f3f3f;
 33 const int MOD = 1e9 + 7;
 34 const double EPS = 1e-9;
 35 
 36 /*
 37 #include <ext/pb_ds/assoc_container.hpp>
 38 #include <ext/pb_ds/tree_policy.hpp>
 39 
 40 using namespace __gnu_pbds;
 41 tree<pli, null_type, greater<pli>, rb_tree_tag, tree_order_statistics_node_update> T;
 42 */
 43 
 44 int T, m, n, a[105][2015], b[2015], c[2015], rec[2015];
 45 struct gg {
 46     int i, j, k;
 47     gg () {}
 48     gg (int i, int j, int k) : i(i), j(j), k(k) {}
 49     bool operator > (const gg &g) const {
 50         if (a[i][j] + b[k] == a[g.i][g.j] + b[g.k]) {
 51             return j + k > g.j + g.k;
 52         }
 53         return a[i][j] + b[k] > a[g.i][g.j] + b[g.k];
 54     }
 55 };
 56 priority_queue<gg, vector<gg>, greater<gg> > que;
 57 int main() {
 58     scanf("%d", &T);
 59     while (T--) {
 60         scanf("%d%d", &m, &n);
 61         for (int i = 1; i <= m; ++i) {
 62             for (int j = 1; j <= n; ++j) {
 63                 scanf("%d", &a[i][j]);
 64             }
 65             sort(a[i] + 1, a[i] + n + 1);
 66         }
 67         for (int i = 1; i <= n; ++i) {
 68             b[i] = a[1][i];
 69         }
 70         for (int i = 2; i <= m; ++i) {
 71             for (int j = 1; j <= n; ++j) {
 72                 rec[j] = 0;
 73             }
 74             while (que.size()) que.pop();
 75             que.push(gg(i, 1, 1));
 76             int index = 0;
 77             while (que.size() && index < n) {
 78                 gg g = que.top(); que.pop();
 79                 int jj = g.j, kk = g.k;
 80                 if (kk <= rec[jj]) continue;
 81                 else rec[jj] = kk;
 82                 if (jj < n) {
 83                     que.push(gg(i, jj + 1, kk));
 84                 }
 85                 if (kk < n) {
 86                     que.push(gg(i, jj, kk + 1));
 87                 }
 88                 c[++index] = a[i][jj] + b[kk];
 89             }
 90             for (int j = 1; j <= n; ++j) {
 91                 b[j] = c[j];
 92             }
 93         }
 94         for (int i = 1; i < n; ++i) {
 95             printf("%d ", b[i]);
 96         }
 97         printf("%d \n", b[n]);
 98     }
 99     return 0;
100 }
View Code

 

转载于:https://www.cnblogs.com/BIGTOM/p/8985904.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 内容概要 《计算机试卷1》是一份综合性的计算机基础和应用测试卷,涵盖了计算机硬件、软件、操作系统、网络、多媒体技术等多个领域的知识点。试卷包括单选题和操作应用两大类,单选题部分测试学生对计算机基础知识的掌握,操作应用部分则评估学生对计算机应用软件的实际操作能力。 ### 适用人群 本试卷适用于: - 计算机专业或信息技术相关专业的学生,用于课程学习或考试复习。 - 准备计算机等级考试或职业资格认证的人士,作为实战演练材料。 - 对计算机操作有兴趣的自学者,用于提升个人计算机应用技能。 - 计算机基础教育工作者,作为教学资源或出题参考。 ### 使用场景及目标 1. **学习评估**:作为学校或教育机构对学生计算机基础知识和应用技能的评估工具。 2. **自学测试**:供个人自学者检验自己对计算机知识的掌握程度和操作熟练度。 3. **职业发展**:帮助职场人士通过实际操作练习,提升计算机应用能力,增强工作竞争力。 4. **教学资源**:教师可以用于课堂教学,作为教学内容的补充或学生的课后练习。 5. **竞赛准备**:适合准备计算机相关竞赛的学生,作为强化训练和技能检测的材料。 试卷的目标是通过系统性的题目设计,帮助学生全面复习和巩固计算机基础知识,同时通过实际操作题目,提高学生解决实际问题的能力。通过本试卷的学习与练习,学生将能够更加深入地理解计算机的工作原理,掌握常用软件的使用方法,为未来的学术或职业生涯打下坚实的基础。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值