在第二问中,我一开始是这样输出答案的:
for (int i = 1; i <= n; i++)
{
if (f1[i] + f2[n - i + 1] - 1 == ans)
{
printf("%.5lf ", g1[i] * g2[n - i + 1]
}
else
{
printf("%.5lf ", 0);
}
}
获得了 40 分的好成绩。
改成这样:
for (int i = 1; i <= n; i++)
{
if (f1[i] + f2[n - i + 1] - 1 == ans)
{
printf("%.5lf ", g1[i] * g2[n - i + 1]
}
else
{
printf("%.5lf ", 0.0);//这里
}
}
或者这样:
for (int i = 1; i <= n; i++)
{
printf("%.5lf ", f1[i] + f2[n - i + 1] - 1 == ans ? g1[i] * g2[n - i + 1] / sum : 0);
}
或者这样:
for (int i = 1; i <= n; i++)
{
if (f1[i] + f2[n - i + 1] - 1 == ans)//i 可能成为 LDS
{
printf("%.5lf ", g1[i] * g2[n - i + 1] / sum);//乘法原理
}
else
{
cout << fixed << setprecision(5) << 0 << ' ';
}
}
都可以 AC。
顺带一提,我用 40 分的输出方法本地(Windows 系统)能跑过 LibreOJ 上的第 17 个点(挑了个结果带 0 的数据下下来),然而交到 LibreOJ 上过不了。
所以这里的三目运算符是起到了把 int 转换为了 double 的作用吗?对于 printf 函数,做 printf("%.5lf ", 0)
操作,一个是转换为 double,一个原样输出(猜的),是由于环境原因吗?还是别的原因?
还有,如果是在 CCF 的评测机上,这行代码到底会输出什么?