STL--F - Sequence(n*m->之前的最低要求m个月)
2015-08-15 10:24
274 查看
F - Sequence
Time Limit:6000MS Memory Limit:65536KB 64bit IO Format:%I64d
& %I64u
Submit Status
Description
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
Sample Output
感谢http://www.cnblogs.com/372465774y/archive/2012/07/09/2583866.html
做这个题首先思考两个问题
由这两个得出,要求n个数组每一个数组m个值。数组1和数组2的和找出最小的m个,再用来和数组3求和,找到最小的m个,终于得到全部的数组中的最小的m个
因为每一个数组都是有序的,并且我们要求的最小的m个。数组a[i][j]+队列中的值 > 队首的值,那么a[i][j]加上队列中以后的值都会大于队首。对于我们要求解的最小的m个值无意义。队列中保存了当前数组到之前全部数组的最小的m个和,不断更新队列
Time Limit:6000MS Memory Limit:65536KB 64bit IO Format:%I64d
& %I64u
Submit Status
Description
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
感谢http://www.cnblogs.com/372465774y/archive/2012/07/09/2583866.html
做这个题首先思考两个问题
由这两个得出,要求n个数组每一个数组m个值。数组1和数组2的和找出最小的m个,再用来和数组3求和,找到最小的m个,终于得到全部的数组中的最小的m个
因为每一个数组都是有序的,并且我们要求的最小的m个。数组a[i][j]+队列中的值 > 队首的值,那么a[i][j]加上队列中以后的值都会大于队首。对于我们要求解的最小的m个值无意义。队列中保存了当前数组到之前全部数组的最小的m个和,不断更新队列
#include <cstdio> #include <cstring> #include <queue> #include <algorithm> using namespace std; int a[110][2100] , b[2100] ; priority_queue <int> p ; int main() { int i , j , k , n , m , t ; scanf("%d", &t); while(t--) { scanf("%d %d", &n, &m); for(i = 0 ; i < n ; i++) { for(j = 0 ; j < m ; j++) scanf("%d", &a[i][j]); sort(a[i],a[i]+m); } for(i = 0 ; i < m ; i++) p.push(a[0][i]) ; for(i = 1 ; i < n ; i++) { for(j = 0 ; j < m ; j++) { b[j] = p.top(); p.pop(); } for(j = 0 ; j < m ; j++) { for(k = m-1 ; k >= 0 ; k--) { if(j == 0) p.push( a[i][j]+b[k] ); else { if( a[i][j] + b[k] < p.top() ) { p.pop(); p.push(a[i][j]+b[k]); } else break; } } } } for(j = 0 ; j < m ; j++) { b[j] = p.top(); p.pop(); } for(j = m-1 ; j >= 0 ; j--) { if(j == 0) printf("%d\n", b[j]); else printf("%d ", b[j]); } } return 0; }
相关文章推荐
- Software Architecture Has Ethical Consequences
- [笔记]unsigned int 转 char 数组uitoa 函数
- break和continue的区别以及标签label的使用
- Blue Jeans - POJ 3080(多串的共同子串)
- UIButton中setTitleEdgeInsets和setImageEdgeInsets的使用
- UNIQUEIDENTIFIER列上的统计信息
- NHibernate之旅(4):探索查询之条件查询(Criteria Query)
- codeforces 570 D. Tree Requests (dfs序)
- hdu1509(Windows Message Queue) 优先队列
- UIScrollView里面实现视图的移动缩放,点击事件
- codeforces 570D Tree Requests (树转dfs序,区间统计)
- hdu 1679 The Unique MST (克鲁斯卡尔)
- hdu 4000Fruit Ninja 树状数组
- 编写高质量代码改善C#程序的157个建议——建议29:区别LINQ查询中的IEnumerable<T>和IQueryable<T>
- poj 1947 Rebuilding Roads 【树形DP】 【求至少删去树中 多少条边 使得树中节点数为P】
- Codeforces Round #316 (Div. 2) D Tree Requests
- Lesson1 UIWidow,UIView,UILabel的使用
- UVA 1626 - Brackets sequence 区间DP
- codeforces 570 D Tree Requests
- 从UI Automation看Windows平台自动化测试原理