社区讨论
警示后人,不是l>r的问题
P4145上帝造题的七分钟 2 / 花神游历各国参与者 5已保存回复 5
讨论操作
快速查看讨论及其快照的属性,并进行相关操作。
- 当前回复
- 5 条
- 当前快照
- 1 份
- 快照标识符
- @m3vmcn1r
- 此快照首次捕获于
- 2024/11/24 21:12 去年
- 此快照最后确认于
- 2025/11/04 13:59 4 个月前
在分块做法中,如果这样写:
CPPb[L].sum -= a[i] - sqrt(a[i]);
a[i] = sqrt(a[i]);
那么你会WA后5个点。
正确写法是:
CPP正确写法是:
b[L].sum -= a[i];
a[i] = sqrt(a[i]);
b[L].sum += a[i];
或者:
CPPb[L].sum -= a[i] - (int)sqrt(a[i]);
a[i] = sqrt(a[i]);
为什么呢。
因为浮点型位数较多,因此在和整型计算时,整型会自动转为浮点型。而后面的式子相当于
CPP因为浮点型位数较多,因此在和整型计算时,整型会自动转为浮点型。而后面的式子相当于
b[L].sum = b[L].sum - a[i] - sqrt(a[i]);。因为在最后转为整型时会向下取整,当不是完全平方数时减数带有小数点,会使得最后赋的值小1。可以代几个数理解一下: int a = 9 - sqrt(7), b = 9 - (int)sqrt(7);
printf("%d %d", a, b);
输出为6 7
就是这个错误让我找接近1h
回复
共 5 条回复,欢迎继续交流。
正在加载回复...