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<stdio.h> #include<math.h> #include<string.h> int N; int mark[8192]; float P[13]; float R[13][8192][13]; float A[13][13]; float maxp[13]; int maxn[13]; int next[13],next2[13]; #define cq(a) (left&(~(1<<a))) #define ck(a) (left&(1<<a)) #define eq(a,b) fabs(a-b)==0 double S(int left,int i,int turn,int aim) { if(i==aim)return 0; return R[i][cq(aim)][aim==next[turn]?next2[turn]:next[turn]]; } void G(int left,int n) { if(mark[left])return; mark[left]=1; if(n==2) { int a,b; a=0;b=0; int t=left; while(!(t&1)) { ++a; t>>=1; } t>>=1; b=a; while(t) { ++b; t>>=1; } double pp=P[a]+P[b]-P[a]*P[b]; R[a][left][a]=P[a]/pp; R[b][left][a]=(P[b]-P[a]*P[b])/pp; R[b][left][b]=P[b]/pp; R[a][left][b]=(P[a]-P[a]*P[b])/pp; return; } for(int i=0;i<N;++i) { if(ck(i))G(cq(i),n-1); } memset(A,0,sizeof(A)); for(int i=0;i<N;++i) { if(ck(i)) { for(next[i]=i+1;next[i]!=i;++next[i]) { if(next[i]==N)next[i]=0; if(ck(next[i]))break; } for(next2[i]=next[i]+1;next2[i]!=i;++next2[i]) { if(next2[i]==N)next2[i]=0; if(ck(next2[i]))break; } maxp[i]=0; maxn[i]=0; for(int j=0;j<N;++j) { if(ck(j)&&j!=i) { if(S(left,i,i,j)>maxp[i]) { maxp[i]=S(left,i,i,j); maxn[i]=1; } else if(eq(S(left,i,i,j),maxp[i])) maxn[i]++; } } for(int j=0;j<N;++j) { if(ck(j) && j!=i && eq(S(left,i,i,j),maxp[i])) { for(int k=0;k<N;++k) if(ck(k) && j!=k) { A[k][i]+=P[i]*S(left,k,i,j)/maxn[i]; } } } } } for(int i=0;i<N;++i) { if(ck(i)) { double PP=1-P[i]; int last; R[i][left][i]=A[i][i]; for(int j=next[i];j!=i;) { if(ck(j)) { R[i][left][i]+=PP*A[i][j]; PP*=1-P[j]; last=j; } ++j; if(j==N)j=0; } R[i][left][i]/=1-PP; PP=R[i][left][i]; for(int j=last;j!=i;) { if(ck(j)) PP=R[i][left][j]=(1-P[j])*PP+A[i][j]; --j; if(j==-1)j=N-1; } } } } int main() { int TT; scanf("%d",&TT); for(int TTT=0;TTT<TT;++TTT) { scanf("%d",&N); int t; for(int i=0;i<N;++i) { scanf("%d",&t); P[i]=t/100.0; } memset(mark,0,sizeof(mark)); G((1<<N)-1,N); for(int i=0;i<N;++i) { printf ("%.2f ",100*R[i][(1<<N)-1][0]); } 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