「NOIP2020」排水系统(water)

本文介绍了参与NOIP2020竞赛时遇到的一道排水系统问题,作者最初尝试使用拓扑排序和高精度运算解决,导致代码量大且运行超时。后来发现可以通过先除后乘的方法简化计算,实现了更高效的解决方案。文章提供了两种模运算的实现方式,并给出了第一种解法的代码实现。
摘要由CSDN通过智能技术生成

题解1

我成功地把一道 1000 bytes ⁡ 1000\operatorname{bytes} 1000bytes 的签到题活生生地整成了 5000 bytes ⁡ 5000\operatorname{bytes} 5000bytes 的毒瘤题。

我一开始的做法是给所有点反过来做 拓扑排序 ,然后按 拓扑序 从大到小枚举点,暴力地把它的水流完。因为我估算时出了锅,没有考虑到通分后分母最大是 6 0 11 60^{11} 6011 ,所以只开了 long long ,60分。

改题时我打了 高精度 ,非常麻烦,要重载 + , × , ÷ , mod ⁡ , > +,\times,\div,\operatorname{mod},> +,×,÷,mod,> ,而在重载这些运算符的过程中我又用到了 − , ≤ , = = -,\le,== ,,== ,因此把它们也重载了,加上一些运算符还要重载参数为 int 的,直接上了 5000 bytes ⁡ 5000\operatorname{bytes} 5000bytes

改完之后调了好久,接着就是 TLE 的问题了。又卡了卡常才过去。

题解2

其实根本不用那么麻烦,如果先除再乘的话是可以用 long double 水过去的。

先除再乘就是 a b + c d = lcm ⁡ ( b , d ) b ⋅ a + lcm ⁡ ( b , d ) d ⋅ c lcm ⁡ ( b , d ) \begin{aligned}\frac{a}{b}+\frac{c}{d}=\frac{\frac{\operatorname{lcm}(b,d)}{b}\cdot a+\frac{\operatorname{lcm}(b,d)}{d}\cdot c}{\operatorname{lcm}(b,d)}\end{aligned} ba+dc=lcm(b,d)blcm(b,d)a+dlcm(b,d)c

因此可以先处理出 lcm ⁡ ( b , d ) \operatorname{lcm}(b,d) lcm(b,d) ,再计算。

long double 的模运算可以用两种方法实现:

  1. a m o d    b = a − ⌊ a b ⌋ ⋅ b a\mod b=a-\left\lfloor\frac{a}{b}\right\rfloor\cdot b amod
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值