这道题目有点奇怪。
我交堆优化dijk,怎么样都A不掉,都只有10分。
检查了7个小时,重构过,依然不行。
然后放下尊严写邻接矩阵写堆优化,一遍A….
why????
大致是这么做的:
每种药是一个点,假设a+b合成c,那么建一条a到c的边,边权为得到b的代价,建一条b到c的边,边权为得到a的代价。
思考,一开始的时候,每种药都可以通过购买得到,假设价格最小的药是x,那么得到x一定不能更优了。因为如果更优,一定是通过其他两种药混合而成,而x已经是价格最低的药了,因此x通过其他两种药相加不可能更优。
根据最短路的做法,我们可以用x更新其他药。但这里有个问题。
假设x和y合成z。
我们在这里只确定了x是最优的,并不能确定y是最优的;考虑到以后用y更新其他药的时候,也会有y和x合成z的操作,而那时,y是最优的,x也是最优的,他们合成z一定是最便宜的。
因此用x更新其他药的时候,假设x和y合成z,那么只有当y已经被访问过,才执行更新操作。
至于计算方案数,假设x和y合成z,那么z一共可以有x的方案数乘y的方案数种方案数。
1 |
|
代码其实有问题,不过数据比较水,没有出现x和x可以合成z的情况。如果这种情况合法,那么对方案数的贡献只有f(x)×(f(x)+1)/2。