码迷,mamicode.com
首页 > 其他好文 > 详细

来自codeforces round 363

时间:2016-08-04 01:16:49      阅读:237      评论:0      收藏:0      [点我收藏+]

标签:

  具体情况是这样的:同样的程序,在我自己的电脑上跑出来是正确的结果,而提交到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;
}
View Code

  标程:

技术分享
#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;
}
View Code

  提交记录:

  技术分享

  错误结果:

  技术分享

  我发誓,在我自己的电脑上运行,无论是我自己的程序还是标程,输出的都是正确结果,偏偏一提交,结果就错了。

 

来自codeforces round 363

标签:

原文地址:http://www.cnblogs.com/dramstadt/p/5735070.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!