Sequence

Sequence

总时间限制: 
3000ms 
内存限制: 
65536kB
描述

给定m个数字序列,每个序列包含n个非负整数。我们从每一个序列中选取一个数字组成一个新的序列,显然一共可以构造出n^m个新序列。接下来我们对每一个新的序列中的数字进行求和,一共会得到n^m个和,请找出最小的n个和

输入
输入的第一行是一个整数T,表示测试用例的数量,接下来是T个测试用例的输入
每个测试用例输入的第一行是两个正整数m(0 < m <= 100)和n(0 < n <= 2000),然后有m行,每行有n个数,数字之间用空格分开,表示这m个序列
序列中的数字不会大于10000
输出
对每组测试用例,输出一行用空格隔开的数,表示最小的n个和
样例输入
1
2 3
1 2 3
2 2 3
样例输出
3 3 4
  • #include<iostream>
    #include<cmath>
    #include<cstring>
    #include<algorithm>
    #include<iomanip>
    #include<queue>
    #include<stack>
    #include<vector>
    #include<set>
    #include<map>
    using namespace std;
    int a[2005]={0};
    int b[2005]={0};
    int main()
    {
    	int Test;
    	cin>>Test;
    	while(Test--)
    	{
    		int m,n;
    		cin>>m>>n;
    		priority_queue<int>q;
    		for(int i=0;i<n;++i)
    		{
    			cin>>a[i];
    		}
    		sort(a,a+n);
    		if(m==1)
    		{
    			for(int i=0;i<n;++i)
    			{
    				cout<<a[i]<<" ";
    			}
    			cout<<endl;
    			continue;
    		}
    		for(int k=0;k<m-1;++k)
    		{
    			for(int j=0;j<n;++j)
    			{
    				cin>>b[j];
    			}
    			sort(b,b+n);
    			for(int i=0;i<n;++i)
    			{
    				q.push(a[i]+b[0]);
    			}
    			for(int j=1;j<n;++j)
    			{
    				int t;
    				for(t=0;t<n;++t)
    				{
    					if(a[t]+b[j]<q.top())
    					{
    						q.pop();
    						q.push(a[t]+b[j]);
    					}
    					else break;
    				}
    				if(t==0)break;
    			}
    			for(int i=n-1;i>=0;--i)
    			{
    				a[i]=q.top();
    				q.pop();
    			}
    		}
    		for(int i=0;i<n;++i)
    		{
    			cout<<a[i]<<" ";
    		}
    		cout<<endl;
    	}
    	return 0;
    }
    


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值