| ||||||||||
| Online Judge | Problem Set | Authors | Online Contests | User | ||||||
|---|---|---|---|---|---|---|---|---|---|---|
| Web Board Home Page F.A.Qs Statistical Charts | Current Contest Past Contests Scheduled Contests Award Contest | |||||||||
按《算法竞赛进阶指南》的思路写的,为什么会WA啊。。。求大佬看下#include<iostream>
#include<algorithm>
#include<cstdio>
#include<cstring>
using namespace std;
const int maxn=200005;
int a[105][2005];
int ans[2005];
typedef struct Node{
int i;
int j;
bool last;
}node;
node heap[maxn];
int M,N,T,p,n;
void up(int v)
{
while(v>1)
{
if((a[p][heap[v].i]+a[p+1][heap[v].j]) < (a[p][heap[v/2].i]+a[p+1][heap[v/2].j]))
{
swap(heap[v],heap[v/2]);
v /= 2;
}
else
break;
}
}
void Insert(node v)
{
heap[++n] = v;
up(n);
}
node GetTop()
{
return heap[1];
}
void down(int v)
{
int s = v*2;//左节点
while(s <= n)
{
if(s<n && (a[p][heap[s].i]+a[p+1][heap[s].j]) > (a[p][heap[s+1].i]+a[p+1][heap[s+1].j])) s++;//子节点中选最xiao
if((a[p][heap[s].i]+a[p+1][heap[s].j]) < (a[p][heap[v].i]+a[p+1][heap[v].j]))
{
swap(heap[s],heap[v]);
v = s;
s = v*2;
}
else
break;
}
}
void Extract()//将堆顶移除
{
heap[1] = heap[n--];
down(1);
}
void Remove(int k)//移除k位置的节点
{
heap[k]=heap[n--];
up(k);
down(k);
}
void show()
{
int i,j;
for(i=0;i<M;i++)
{
for(j=1;j<=N;j++)
cout<<a[i][j]<<' ';
cout<<endl;
}
cout<<"ans:"<<endl;
for(i=0;i<N;i++)
cout<<ans[i]<<' ';
cout<<endl;
cout<<"p: "<<p<<endl;
}
int main()
{
int i,j;
cin>>T;
while(T--)
{
//Read
scanf("%d%d",&M,&N);
for(i=0;i<M;i++)
for(j=1;j<=N;j++)
scanf("%d",&a[i][j]);
//Init
memset(heap,0,sizeof(heap));
n=0;
p=0;
//Solve
for(i=0;i<M;i++)
sort(a[i]+1,a[i]+N+1);
for(j=0;j<M-1;j++)
{
node t;
t.i=1,t.j=1,t.last=false;
Insert(t);
for(i=0;i<N;i++)
{
//init
t = GetTop();
Extract();
node t1,t2;
ans[i] = a[p][t.i]+a[p+1][t.j];
//update
t1.i = t.i;
t1.j = t.j+1;
t1.last = true;
Insert(t1);
if(t.last == false)
{
t2.i = t.i+1;
t2.j = t.j;
t2.last = false;
Insert(t2);
}
}
p++;
memset(heap,0,sizeof(heap));
n=0;
for(int k=1;k<=N;k++)
a[p][k]=ans[k-1];
// cout<<endl;
// show();
// system("pause");
}
for(int k=0;k<N-1;k++)
cout<<ans[k]<<' ';
cout<<ans[N-1]<<endl;
}
return 0;
}
Followed by: Post your reply here: |
All Rights Reserved 2003-2013 Ying Fuchen,Xu Pengcheng,Xie Di
Any problem, Please Contact Administrator