摘要

题目链接 难度等级 完成状态 完成分数 最后编辑时间 需要注意
最小的N个和 ★☆☆☆☆ 答案正确 100 2015-7-19 17:40:11

代码

1245.cpp代码已折叠
展开折叠内容
显示/移除行号
  1. #include<cstdio>
  2. #include<algorithm>
  3. #include<iostream>
  4. #include<set>
  5. using namespace std;
  6. typedef pair<int,int> v2;
  7. typedef pair<int,v2> v3;
  8. #define r1 first
  9. #define r2 second.first
  10. #define r3 second.second
  11. #define m3(u1,u2,u3) make_pair(u1,make_pair(u2,u3))
  12. set<v3> h;
  13. /*
  14. 之所以用了set而不是priority_queue的原因是……判重
  15. (似乎从第一列开始,逐渐向右也可以解决判重问题)
  16. */
  17. int n;
  18. int a[100100],b[100100];
  19. int main(){
  20. cin>>n;
  21. for(int i=1;i<=n;++i)cin>>a[i];
  22. for(int i=1;i<=n;++i)cin>>b[i];
  23. sort(a+1,a+n+1);
  24. sort(b+1,b+n+1);
  25. /*
  26. a,b从大到小排序
  27. 我们可以设二维表A[i][j]=a[i]+b[j]
  28. A是有单调性的,每个元素比上,左小
  29. 堆中放入最小的A左上角两个节点,可以依次向右、下扩展
  30. */
  31. h.insert(m3(a[1]+b[1],1,1));
  32. for(int i=1;i<=n;++i)
  33. {
  34. v3 u=*h.begin(),n1=u,n2=u;
  35. h.erase(h.begin());
  36. cout<<u.r1<<" ";
  37. //每次输出一个最小点,然后把其右边,下面节点放入//
  38. ++n1.r2;
  39. n1.r1=a[n1.r2]+b[n1.r3];
  40. if(n1.r2<=n)h.insert(n1);
  41. ++n2.r3;
  42. n2.r1=a[n2.r2]+b[n2.r3];
  43. if(n2.r3<=n)h.insert(n2);
  44. }
  45.  
  46. }

著作权声明[编辑]

关于[编辑]