您的位置:首页 > 其它

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

2014-08-01 16:47 183 查看
#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;
}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: