poj 2442 优先队列 复杂度用了两个break 降到了m*n*log(n)

来源:互联网 发布:tensorflow pytorch 编辑:程序博客网 时间:2024/06/05 22:07
#include<iostream>#include<algorithm>#include<queue>using namespace std;int a[5000],b[5000],a1[3000],c;priority_queue<int> q;int main(){int t,i,j,m,n,temp;cin>>t;while(t--){i=0;cin>>m>>n;                      //while(m--)这种写法好是好,但是m的值会因此改变for(i=0;i<n;i++)cin>>a[i];m--;while(m--){for(i=0;i<n;i++)              //第一次这样写,思路是两两相加,取前n个和下一行相加,这样既减少了复杂度,又能避免开二维数组cin>>b[i];sort(b,b+n);for(i=0;i<n;i++)                                   //for(i=0;i<n;i++)  a1[i]=a[i]+b[0];                                    // for(j=0;j<n;j++)for(i=0;i<n;i++)q.push(a1[i]);sort(a,a+n);for(i=1;i<n;i++)                                        //c[k++]=a[i]+b[j];{ temp=0;     for(j=0;j<n;j++)                                 // sort(c,c+n*n); { c=a[j]+b[i]; if(c<q.top()) { q.pop(); q.push(c); temp=1; } else break;}if(temp==0)break;}i=0;while(!q.empty()){a[i++]=q.top();q.pop();}}sort(a,a+n);for(i=0;i<n-1;i++)cout<<a[i]<<" ";cout<<a[i]<<endl;}}

0 0