我正在解决网上法官的问题。问题是这样的:
有
n
人。他们将参加比赛。他们必须跑s
米。每位玩家
i
的原始速度为v_i
(m / s)。每位玩家以v_i
的速度跑,直到他跑80%的比赛(0.8s
米),当只剩下20%(0.2s
米)时,速度变为{{1} }(女士)。 (令人惊讶!)组织者想知道每位球员在前3名球员到达终点线之前的距离总和。你应该将答案四舍五入到最接近的整数。
我的解决方案是这样的:
v_i + 10
。v
。这是0.8s / v + 0.2s / (v + 10)
。t
变量并将其设为0. answer
的每个v_i
:
v
,此播放器在[{1}}时间之前运行t
公里。因此,请将t * v
添加到t
。t * v
公里之前运行answer
公里。因此,请将0.8s + (0.8s / v - t) * (v + 5)
添加到t
。0.8s + (0.8s / v - t) * (v + 5)
(answer
)的每个v_i
:将v
添加到v_i >= v
,因为他们完成了比赛。d
。但在某些情况下它会出错。乍一看,我认为这是因为精度错误,所以我使用了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);
}