题目链接 | 难度等级 | 完成状态 | 完成分数 | 最后编辑时间 | 需要注意 |
---|---|---|---|---|---|
最小的N个和 | ★☆☆☆☆ | 答案正确 | 100 | 2015-7-19 17:40:11 | 无 |
1245.cpp代码已折叠
展开折叠内容
|
---|
#include<cstdio> #include<algorithm> #include<iostream> #include<set> using namespace std; typedef pair<int,int> v2; typedef pair<int,v2> v3; #define r1 first #define r2 second.first #define r3 second.second #define m3(u1,u2,u3) make_pair(u1,make_pair(u2,u3)) set<v3> h; /* 之所以用了set而不是priority_queue的原因是……判重 (似乎从第一列开始,逐渐向右也可以解决判重问题) */ int n; int a[100100],b[100100]; int main(){ cin>>n; for(int i=1;i<=n;++i)cin>>a[i]; for(int i=1;i<=n;++i)cin>>b[i]; sort(a+1,a+n+1); sort(b+1,b+n+1); /* a,b从大到小排序 我们可以设二维表A[i][j]=a[i]+b[j] A是有单调性的,每个元素比上,左小 堆中放入最小的A左上角两个节点,可以依次向右、下扩展 */ h.insert(m3(a[1]+b[1],1,1)); for(int i=1;i<=n;++i) { v3 u=*h.begin(),n1=u,n2=u; h.erase(h.begin()); cout<<u.r1<<" "; //每次输出一个最小点,然后把其右边,下面节点放入// ++n1.r2; n1.r1=a[n1.r2]+b[n1.r3]; if(n1.r2<=n)h.insert(n1); ++n2.r3; n2.r1=a[n2.r2]+b[n2.r3]; if(n2.r3<=n)h.insert(n2); } } |