明白队列的话就很简单,不会就慢慢理解慢慢学,我也是刚刚接触
代码:
#include <iostream> #include <string.h> #include <stdio.h> #include <algorithm> #include <queue> using namespace std; int main() { priority_queue<int, vector<int>, less<int> >q; int n,m,i,j,k; int t; int a[2001],b[2001]; scanf("%d",&t); while(t--) { scanf("%d%d",&n,&m); for(i=0;i<m;i++) scanf("%d",&a[i]);//先输入一行数据按顺序排好 sort(a,a+m); for(i=1;i<n;i++)//输入剩下的n-1组数据,进行求和,选择最优的继续循环 { for(j=0;j<m;j++) scanf("%d",&b[j]); for(j=0;j<m;j++) q.push(a[0]+b[j]);//第一组放进去先默认最小sum for(j=1;j<m;j++)//循环找符合条件的放进队列里 { for(k=0;k<m;k++) { if(a[j]+b[k]<q.top()) { q.pop(); q.push(a[j]+b[k]); } } } for(j=0;j<m;j++)//更新最小sum继续循环 { a[j]=q.top(); q.pop(); } sort(a,a+m); } for(i=0;i<m;i++) { if(i==m-1) printf("%d ",a[i]); else printf("%d ",a[i]); } } }
#include <iostream> #include <string.h> #include <stdio.h> #include <algorithm> #include <queue> using namespace std; int main() { priority_queue<int, vector<int>, less<int> >q; int n,m,i,j,k; int t; int a[2001],b[2001]; scanf("%d",&t); while(t--) { scanf("%d%d",&n,&m); for(i=0;i<m;i++) scanf("%d",&a[i]);//先输入一行数据按顺序排好 sort(a,a+m); for(i=1;i<n;i++)//输入剩下的n-1组数据,进行求和,选择最优的继续循环 { for(j=0;j<m;j++) scanf("%d",&b[j]); for(j=0;j<m;j++) q.push(a[0]+b[j]);//第一组放进去先默认最小sum for(j=1;j<m;j++)//循环找符合条件的放进队列里 { for(k=0;k<m;k++) { if(a[j]+b[k]<q.top()) { q.pop(); q.push(a[j]+b[k]); } } } for(j=0;j<m;j++)//更新最小sum继续循环 { a[j]=q.top(); q.pop(); } sort(a,a+m); } for(i=0;i<m;i++) { if(i==m-1) printf("%d ",a[i]); else printf("%d ",a[i]); } } }