链接:https://soundhound2018-summer-qual.contest.atcoder.jp/tasks/soundhound2018_summer_qual_d
有n个城市,一个人从s出发到t。手里一开始有1E15日元,现在有两种货币,这个人只能将日元兑换成另一种货币,并且是全部兑换。每到一个城市,这人就会在该城市呆一年。城市之间有火车,火车票价格是$a_i$yen或$b_i$snuuk,在每一个城市$i$,第$i$年的时候可以在该城市将yen兑换成snuuk。现在希望让这人剩的snuuk最多,问这人在1~n年内剩最多为多少snuuk。
我们首先关注火车票的花费,希望snuuk剩的最多,只有在买火车票时才会花费,因此直接将火车票花费最小化就可以。
我们做两次最短路:$s$到各点,使用yen做货币,价格为$d1_i$;$t$到各点,使用snuuk做货币,价格为$d2_i$。这样我们可以获得每一个点的总计花费就是$d1_i+d2_i$。
然后再考虑每一年,这人要在每一个城市呆最少一年,最长无限。那么按照城市的兑换开始时间倒着扫一遍,用年份多的剩的多的更新前几年的就可以了。
(流下了不会写C++的眼泪)
1 |
|