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; } }
相关文章推荐
- 维持队列最大值max(1),出队入队log(n)复杂度的方法
- 两个有序数组求中位数log(m+n)复杂度
- 两个有序数组求中位数log(m+n)复杂度
- 两个栈实现队列和两个队列实现栈-Python实现-复杂度分析
- Java 用两个队列实现一个栈,要求top()的时间复杂度为O(1)
- 两个栈实现一个队列的push和pop
- 两个顺序栈实现顺序队列功能
- 用两个栈实现一个队列算法
- 两个栈实现一个队列
- 剑指offer-面试题7-用两个栈实现队列
- 两个栈实现一个队列
- 用C++实现用两个栈实现一个队列的功能
- 用两个队列实现一个栈
- 剑指offer - 面试题7:用两个栈实现队列
- 两个栈实现队列 两个队列实现栈
- 剑指offer——用两个栈实现队列
- 题6:用两个栈实现队列
- 47. 腾讯面试题: 用两个栈实现队列
- 面试题7:用两个栈实现队列