标签:分组 cout ons -- wing 16px sequence EAP auto
# 题意
m个序列,每个里面包含n个非0整数,
现在可以从每个序列中选择一个数字形成具有m个整数的序列
总共有n^m种序列,计算每个序列中的数字之和,得到n^m个值,求这些序列和中的最小的n个值
# 题解
即从m个里面每个选一个,输出最小的n个和
分组,每次都将两个的前n个看作是一个新的,同后面的一块计算,
求出前n小的作为新的一组,一直迭代最后求出的自然就是整个的前n小的
1 #include <bits/stdc++.h> 2 using namespace std; 3 const int N=2010; 4 int n,m; 5 int a[N],c[N],b[N]; 6 typedef pair<int,int> pii; 7 8 void work(){ 9 for(int j=2;j<=m;j++){ 10 priority_queue<pii,vector<pii>,greater<pii>>heap; 11 for(int i=1;i<=n;i++){ 12 cin>>b[i]; 13 } 14 15 for(int i=1;i<=n;i++){ 16 heap.push({a[1]+b[i],1}); 17 } 18 19 for(int i=1;i<=n;i++){ 20 auto t = heap.top(); 21 c[i]=t.first; 22 int p=t.second; 23 heap.pop(); 24 heap.push({t.first-a[p]+a[p+1],p+1}); 25 } 26 for(int i=1;i<=n;i++){ 27 a[i]=c[i]; 28 } 29 } 30 } 31 int main(){ 32 int t; 33 cin>>t; 34 while(t--){ 35 cin>>m>>n; 36 for(int i=1;i<=n;i++){ 37 cin>>a[i]; 38 } 39 sort(a+1,a+n+1); 40 work(); 41 for(int i=1;i<=n;i++){ 42 cout<<a[i]<<‘ ‘; 43 } 44 cout<<endl; 45 } 46 }
标签:分组 cout ons -- wing 16px sequence EAP auto
原文地址:https://www.cnblogs.com/hhyx/p/12536315.html