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 |
Re:气死我了,怎么会WA,,这么优秀的算法。。。In Reply To:气死我了,怎么会WA,,这么优秀的算法。。。 Posted by:bankrupt at 2010-04-23 17:16:46 > #include<stdio.h> > #include<string.h> > #include<stdlib.h> > #include<iostream> > #include<algorithm> > #include<cmath> > #include<map> > using namespace std; > int n,m; > double eval[4][4000000]; > int tnum[55],bou,ax[4]; > struct pp > { > int num[4],id; > double f_value,e_value; > double pri; > }; > double dp[4000000]; > int p[4000000]; > pp rou[4000000]; > bool cmp(pp x,pp y) > { > return x.id<y.id; > } > pp now,heap[10000000],po,nw,query[100001],there[55]; > int size; > char ch; > void heapify(int id) > { > int l=2*id+1,r=2*id+2,ii=id; > if(l<size&&heap[l].f_value+heap[l].e_value<heap[ii].f_value+heap[ii].e_value) > ii=l; > if(r<size&&heap[r].f_value+heap[r].e_value<heap[ii].f_value+heap[ii].e_value) > ii=r; > if(ii!=id) > { > swap(heap[ii],heap[id]); > heapify(ii); > } > } > void min_heapify(int id) > { > int ii=(id-1)/2; > if(id&&heap[ii].f_value+heap[ii].e_value>heap[id].f_value+heap[ii].e_value) > { > swap(heap[ii],heap[id]); > min_heapify(ii); > } > } > double astar(pp x) > { > int id,ip,i,j,s,bou=(x.num[0]+1)*(x.num[1]+1)*(x.num[2]+1)*(x.num[3]+1); > for(i=0;i<bou;i++) > dp[i]=(double)100000000.000*(double)100000000.000; > p[0]=0; > size=1; > memset(heap[0].num,0,sizeof(heap[0].num)); > heap[0].f_value=0; > heap[0].e_value=0; > dp[0]=0; > for(i=0;i<4;i++) > { > if(heap[0].e_value<eval[i][x.num[i]]) > heap[0].e_value=eval[i][x.num[i]]; > } > while(size) > { > nw=heap[0]; > id=nw.num[0]*(x.num[1]+1)*(x.num[2]+1)*(x.num[3]+1)+nw.num[1]*(x.num[2]+1)*(x.num[3]+1)+nw.num[2]*(x.num[3]+1)+nw.num[3]; > heap[0]=heap[size-1]; > if(nw.e_value==0) > return nw.f_value; > size--; > heapify(0); > for(i=0;i<n;i++) > { > for(j=0;j<4;j++) > now.num[j]=min(x.num[j],nw.num[j]+there[i].num[j]); > ip=now.num[0]*(x.num[1]+1)*(x.num[2]+1)*(x.num[3]+1)+now.num[1]*(x.num[2]+1)*(x.num[3]+1)+now.num[2]*(x.num[3]+1)+now.num[3]; > if(dp[ip]>dp[id]+there[i].pri) > { > now.e_value=0; > for(j=0;j<4;j++) > { > if(now.e_value<eval[j][x.num[j]-now.num[j]]) > now.e_value=eval[j][x.num[j]-now.num[j]]; > } > dp[ip]=dp[id]+there[i].pri; > now.f_value=dp[ip]; > p[ip]=i+1; > rou[ip]=nw; > heap[size++]=now; > min_heapify(size-1); > } > } > } > } > int main() > { > int id,ip,tst=0,i,j,s,op; > while(scanf("%d",&n)&&n) > { > tst++; > for(i=0;i<n;i++) > { > scanf("%d%lf",&there[i].id,&there[i].pri); > memset(there[i].num,0,sizeof(there[i].num)); > ch=getchar(); > op=j=0; > while(ch!='\n') > { > if(ch>='a'&&ch<='z') > { > there[i].num[j]+=op; > j=ch-'a'; > op=0; > } > else if(ch>='0'&&ch<='9') > op=10*op+ch-'0'; > ch=getchar(); > } > there[i].num[j]+=op; > } > sort(there,there+n,cmp); > memset(ax,0,sizeof(ax)); > scanf("%d",&m); > ch=getchar(); > j=0; > for(i=0;i<m;i++) > { > ch=getchar(); > memset(query[i].num,0,sizeof(query[i].num)); > j=op=0; > while(ch!='\n') > { > if(ch>='a'&&ch<='z') > { > query[i].num[j]+=op; > j=ch-'a'; > op=0; > } > else if(ch>='0'&&ch<='9') > op=10*op+ch-'0'; > ch=getchar(); > } > query[i].num[j]+=op; > for(j=0;j<4;j++) > { > if(ax[j]<query[i].num[j]) > ax[j]=query[i].num[j]; > } > } > for(i=0;i<4;i++) > { > for(j=0;j<=ax[i];j++) > eval[i][j]=(double)100000000.000*(double)100000000.000; > eval[i][0]=0.000; > } > for(i=0;i<n;i++) > for(j=0;j<4;j++) > { > for(s=0;s+there[i].num[j]<=ax[j];s++) > { > if(eval[j][s+there[i].num[j]]>eval[j][s]+there[i].pri) > eval[j][s+there[i].num[j]]=eval[j][s]+there[i].pri; > } > } > for(i=0;i<4;i++) > for(j=ax[i];j>0;j--) > { > if(eval[i][j-1]>eval[i][j]) > eval[i][j-1]=eval[i][j]; > } > for(i=0;i<4;i++) > nw.num[i]=ax[i]; > printf("Input set #%d:\n",tst); > for(i=0;i<m;i++) > { > printf("%d:%8.2lf",i+1,astar(query[i])); > memset(tnum,0,sizeof(tnum)); > now=query[i]; > while(true) > { > int ip=now.num[0]*(query[i].num[1]+1)*(query[i].num[2]+1)*(query[i].num[3]+1)+now.num[1]*(query[i].num[2]+1)*(query[i].num[3]+1)+now.num[2]*(query[i].num[3]+1)+now.num[3]; > if(p[ip]<=0) > break; > tnum[p[ip]-1]++; > now=rou[ip]; > } > for(j=0;j<n;j++) > { > if(tnum[j]>0) > { > printf(" %d",there[j].id); > if(tnum[j]>1) > printf("(%d)",tnum[j]); > } > } > printf("\n"); > } > } > return 0; > } 恭喜你,你打错了一个字 Followed by:
Post your reply here: |
All Rights Reserved 2003-2013 Ying Fuchen,Xu Pengcheng,Xie Di
Any problem, Please Contact Administrator