具体情况是这样的:同样的程序,在我自己的电脑上跑出来是正确的结果,而提交到CF的评测机后对于相同的输入数据,结果居然不一样了!反复检查后未发现任何问题。目前怀疑可能与memset有关,因为在一步步修改AC代码以接近我自己写的程序的时候改到这里时标程也出现了同样的状况(我的程序与标程思路完全一样,代码也几乎完全相同)。
我的程序与标程的对比:
我的程序:
#include<stdio.h> #include<string.h> double p[21],ans[21],dp[1<<20+100]; int main() { //freopen("input.txt","r",stdin); int N,K; scanf("%d%d",&N,&K); memset(ans,0,sizeof(ans)); memset(dp,0,sizeof(dp)); for (int i=0;i<N;i++) scanf("%lf",&p[i]); dp[0]=1; for (int i=1;i<(1<<N);i++) { double sp=0; int cnt=0; for (int j=0;j<N;j++) if ((i&(1<<j))==0) { cnt++; sp+=p[j]; } if (N-cnt>K) continue; for (int j=0;j<N;j++) { if(p[j]<0.000000001)continue; if(((1<<j)&i)!=0) { dp[i]+=dp[i-(1<<j)]*p[j]/(sp+p[j]); ans[j]+=dp[i-(1<<j)]*p[j]/(sp+p[j]); } } } for (int i=0;i<N;i++) printf("%.9lf ",ans[i]); //fclose(stdin); return 0; }
标程:
#include<stdio.h> int N, K; double p[22]; double ans[22]; double dp[1 << 20 + 100]; int main() { int k; double sp; scanf ( "%d%d", &N, &K ); for ( int i = 0; i < N; i++ ) { scanf ( "%lf", &p[i] ); } dp[0] = 1; for ( int i = 1; i < ( 1 << N ); i++ ) { sp = 0; k = 0; for ( int j = 0; j < N; j++ ) { if ( ( ( 1 << j ) &i ) == 0 ) { sp += p[j]; k++; } } if ( N - k > K ) continue; for ( int j = 0; j < N; j++ ) { if ( p[j] < 0.000000001 ) continue; if ( ( ( 1 << j ) &i ) != 0 ) { dp[i] += dp[i - ( 1 << j )] * p[j] / ( sp + p[j] ); ans[j] += dp[i - ( 1 << j )] * p[j] / ( sp + p[j] ); } } } for ( int i = 0; i < N; i++ ) { printf ( "%.10lf ", ans[i] ); } return 0; }
提交记录:
错误结果:
我发誓,在我自己的电脑上运行,无论是我自己的程序还是标程,输出的都是正确结果,偏偏一提交,结果就错了。