以下为100pts第一问的代码
bool check(int x)
{
if(a[x] == 0)//速度不变
{
//如果速度本来就超速,且这段路程有摄像头,超速
if(v[x] > V && (sum[L] - sum[d[x]-1] > 0))
{
q.push((node){d[x],L});
return true;
}
//如果速度不超速或没有摄像头,不超速
return false;
}
if(a[x] > 0)//加速度大于0
{
//速度本来就超速,还有摄像头,超速
if(v[x] > V)
{
if(sum[L] - sum[d[x]-1] > 0)
{
q.push((node){d[x],L});
return true;
}
return false;
}
//dis:加速加到超速距离
int dis = d[x] + ceil((double)((V*V - v[x]*v[x])*1.0/(2.0*a[x])) + 1e-6);
//如果超速时已经驶离,那么不超速
if(dis > L) return false;
//未驶离
else
{
//超速时位置
if(sum[L] - sum[dis-1] > 0)
{
q.push((node){dis,L});
return true;
}
//如果有摄像头,超速
else return false;
//没有,不超速
}
}
//加速度小于0
if(a[x] < 0)
{
//如果本来不超速,则不超速
if(v[x] <= V) return false;
int dis = d[x] + floor((double)((V*V - v[x]*v[x])*1.0/(2.0*a[x])) - 1e-6);
dis = min(dis,L);
if(sum[dis] - sum[d[x]-1] > 0)
{
q.push((node){d[x],dis});
return true;
}
return false;
}
}
以下为60pts第一问的代码
bool solve(int x)
{
if(a[x] == 0)//速度不变
{
//如果速度本来就超速,且这段路程有摄像头,超速
if(v[x] > V && (sum[L] - sum[d[x]-1] > 0))
{
q.push((node){d[x],L});
return true;
}
//如果速度不超速或没有摄像头,不超速
return false;
}
if(a[x] > 0)//加速度大于0
{
//速度本来就超速,还有摄像头,超速
if(v[x] > V)
{
if(sum[L] - sum[d[x]-1] > 0)
{
q.push((node){d[x],L});
return true;
}
return false;
}
//dis:加速加到超速距离
int dis = d[x] + ceil((double)((V*V - v[x]*v[x])*1.0/(2.0*a[x])));
//如果超速时已经驶离,那么不超速
if(dis > L) return false;
//未驶离
else
{
//超速时位置
if(sum[L] - sum[dis-1] > 0)
{
q.push((node){dis,L});
return true;
}
//如果有摄像头,超速
else return false;
//没有,不超速
}
}
//加速度小于0
if(a[x] < 0)
{
//如果本来不超速,则不超速
if(v[x] <= V) return false;
int dis = d[x] + floor((double)((V*V - v[x]*v[x])*1.0/(2.0*a[x])));
dis = min(dis,L);
if(sum[dis] - sum[d[x]-1] > 0)
{
q.push((node){d[x],dis});
return true;
}
return false;
}
}
60pts的代码计算 a > 0 及 a < 0 的情况出现了错误,其中,对于100pts的代码我对使用floor及ceil的两行代码添加了1e-6的玄学调试
求问两种写法在实际使用中为何会有差别(或者本题我的第一问解法本身出现了错误),以及能否在不使用浮点数的情况下保证答案正确?