有一天 我发现一个秘密——————
yxc大佬的写法和lyd大佬不同....
这里整理一下灿哥的写法
lyd的写法中有i,j两个指针,导致代码较难实现
需要结构体
具体参加隔壁题解
灿哥则直接一个i指针指向a数组
将b数组直接全部放到堆中
然后取出,更新堆中数据
一个pair即可胜任
配合小根堆代码极其简洁
lyd版代码如下
#include<iostream>
#include<cstdio>
#include<tr1/unordered_map>
#include<set>
#include<cmath>
#include<queue>
#include<algorithm>
#include<stack>
using namespace std;
using namespace tr1;
const int N=2005,inf=0x3f3f3f3f;
typedef pair<int,int> pii;
struct node{
int x,y,val;
bool ok;
};
int n,m,t,x,pt=1,a[N][2*N],ans[N];
bool operator < (const node __x, const node __y)
{
return __x.val > __y.val;
}
int main()
{
cin>>t;
while(t--)
{
scanf("%d%d",&n,&m);
for(int i=1;i<=n;i++)for(int j=1;j<=m;j++)
scanf("%d",&a[i][j]);
int i=2;
sort(a[1]+1,a[1]+m+1);
if(n==1)
{
for(int i=1;i<=m;i++)printf("%d ",a[1][i]);
puts("");
continue;
}
while(i<=n)
{
sort(a[i]+1,a[i]+m+1);
ans[1]=a[i][1]+a[i-1][1];
int cnt=2;
priority_queue<node> q1;
node n1,n2;
n1.x=1;n1.y=2;n1.val=a[i-1][1]+a[i][2];n1.ok=0;
n2.x=2;n2.y=1;n2.val=a[i-1][2]+a[i][1];n2.ok=1;
q1.push(n1);
q1.push(n2);
while(cnt<=m)
{
node u=q1.top();
q1.pop();
ans[cnt++]=u.val;
node pn1;
pn1.x=u.x;pn1.y=u.y+1;pn1.val=a[i-1][pn1.x]+a[i][pn1.y];pn1.ok=0;
q1.push(pn1);
if(u.ok)
{
node pn2;
pn2.x=u.x+1;pn2.y=u.y;pn2.val=a[i-1][pn2.x]+a[i][pn2.y];pn2.ok=1;
q1.push(pn2);
}
}
for(int j=1;j<=m;j++)a[i][j]=ans[j];
i++;
}
for(int i=1;i<=m;i++)printf("%d ",ans[i]);
puts("");
}
}
yxc版代码如下
#include<iostream>
#include<cstdio>
#include<algorithm>
#include<queue>
#include<vector>
using namespace std;
const int N=2010;
typedef pair<int,int> PII;
int T,a[N],m,n,b[N],c[N];
void merge()
{
priority_queue<PII,vector<PII>,greater<PII> > heap;
for(int i=1;i<=n;i++)heap.push({a[1]+b[i],1});
int cnt=1;
while(cnt<=n)
{
int s=heap.top().first;
int p=heap.top().second;
heap.pop();
c[cnt++]=s;
heap.push({s-a[p]+a[p+1],p+1});
}
for(int i=1;i<=n;i++)a[i]=c[i];
}
int main()
{
cin>>T;
while(T--)
{
cin>>m>>n;
for(int i=1;i<=n;i++)
scanf("%d",&a[i]);
sort(a+1,a+n+1);
m--;
while(m--)
{
for(int i=1;i<=n;i++)
scanf("%d",&b[i]);
merge();
}
for(int i=1;i<=n;i++)printf("%d ",a[i]);
puts("");
}
}
lyd是谁啊?
李玉东
y总这个代码 优雅 优雅
y总的代码总是那么简洁明了