题目
给K种浓度分别为$\frac{a_i}{1000}$的饮料,要求每种饮料用整数升,兑出浓度为$\frac{N}{1000}$的饮料。求最少要用几升饮料。
数据范围
$0\leq n\leq 1000,1\leq k\leq 10^6$
$0\leq ai \leq 1000,a_i \in Z$
做法
由鸽巢原理,不同浓度的饮料最多有1001种。
令K为不同浓度的种数。设每种饮料用了xi升,则有
$$
\frac{\sum_{i=1}^Kx_i\times \frac{a_i}{1000}}{\sum_{i=1}^Kx_i}=\frac{N}{1000}
$$
化简后为
$$
\sum_{i=1}^Kx_i\times (N−a_i)=0
$$
原问题就规约为:从集合${N-a_i}$中取最少的数(每个数可以取任意次),使得他们的和为0。
我们以和为顶点,根据集合中的数来连边(若集合中有数字$N−a_i$,则从和$s$到和$s+(N−a_i)$连边)。
问题就规约成:找从0开始,以0结束的最小环的长度。BFS即可。
优化:由N和$a_i$的范围可知:$−1000\leq N−a_i\leq 1000$。所以若存在起点、终点为0的环,则我们可以通过重构环上边的顺序,使得每次经过一条边后,和都在[−1000,1000]的范围内。因此我们建图时,和的范围在[−1000,1000]内即可。
时间复杂度:$O(E)=O(2001\times max(1001,K))$
代码
|
|