zoukankan      html  css  js  c++  java
  • #来自codeforces round 363

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

      提交记录:

      

      错误结果:

      

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

  • 相关阅读:
    centos7 源码安装python3
    gitlab 迁移
    gitlab 搭建
    亚伦史沃茨 公开信
    误删了sudo包怎么办
    在中国历史上,我个人最喜欢的三个皇帝
    安装PHP7
    Mac OS上设置Django开发环境
    The Pragmatic Programmer Quick Reference Guide
    Nginx的第一个模块-HelloWorld
  • 原文地址:https://www.cnblogs.com/dramstadt/p/5735070.html
Copyright © 2011-2022 走看看