轻松在线判断任务,但很难找到我的实施错误

时间:2016-12-10 02:45:48

标签: c++ debugging math

我正在解决网上法官的问题。问题是这样的:

  

n人。他们将参加比赛。他们必须跑s米。

     

每位玩家i的原始速度为v_i(m / s)。每位玩家以v_i的速度跑,直到他跑80%的比赛(0.8s米),当只剩下20%(0.2s米)时,速度变为{{1} }(女士)。 (令人惊讶!)

     

组织者想知道每位球员在前3名球员到达终点线之前的距离总和。你应该将答案四舍五入到最接近的整数。

我的解决方案是这样的:

  1. 找到第三大速度v_i + 10
  2. 决定前3名的时间是v。这是0.8s / v + 0.2s / (v + 10)
  3. 制作一个t变量并将其设为0.
  4. 对于小于answer的每个v_i
    1. 如果v,此播放器在[{1}}时间之前运行t公里。因此,请将t * v添加到t
    2. 否则,此玩家将在t * v公里之前运行answer公里。因此,请将0.8s + (0.8s / v - t) * (v + 5)添加到t
  5. 对于不小于0.8s + (0.8s / v - t) * (v + 5)answer)的每个v_i:将v添加到v_i >= v,因为他们完成了比赛。
  6. 打印d
  7. 但在某些情况下它会出错。乍一看,我认为这是因为精度错误,所以我使用了Java的answer,但它仍然得到WA判决。上面的逻辑中是否有任何错误,或者是我的实现错误?

    这是我在C ++中的代码:

    floor(answer)

    提前致谢:D

    示例:

    输入:

    BigDecimal

    输出:

    #include<cstdio>
    int main()
    {
        int s,n;scanf("%d%d",&s,&n);
        int v[1000],i,j;
        for(i=0;i<n;i++)scanf("%d",&v[i]);
        for(i=0;i<n;i++)
        {
            for(j=i+1;j<n;j++)
            {
                if(v[i]>v[j])
                {
                    int temp=v[i];
                    v[i]=v[j];
                    v[j]=temp;
                }
            }
        }
        int vv=v[n-3];
        double t=0.8*s/vv+0.2*s/(vv+10);
        double answer=0;
        for(i=0;i<n;i++)
        {
            if(v[i]<vv)
            {
                if(t*v[i]<=0.8*s)
                {
                    answer+=t*v[i];
                }
                else
                {
                    answer+=0.8*s+(t-0.8*s/v[i])*(v[i]+10);
                }
            }
            else
            {
                answer+=s;
            }
        }
        printf("%d\n",(int)answer);
    }
    

0 个答案:

没有答案