洛谷 2737 麦香牛块 最短路SPFA? 解题报告

来源:互联网 发布:程序员 多个显示器 编辑:程序博客网 时间:2024/06/07 05:24

题目描述

农夫布朗的奶牛们正在进行斗争,因为它们听说麦当劳正在考虑引进一种新产品:麦香牛块。奶牛们正在想尽一切办法让这种可怕的设想泡汤。奶牛们进行斗争的策略之一是“劣质的包装”。“看,”奶牛们说,“如果你只用一次能装3块、6块或者10块的三种包装盒包装麦香牛块,你就不可能满足一次只想买1、2、4、5、7、8、11、14或者17块麦香牛块的顾客了。劣质的包装意味着劣质的产品。”

你的任务是帮助这些奶牛。给出包装盒的种类数N(1<=N<=10)和N个代表不同种类包装盒容纳麦香牛块个数的正整数(1<=i<=256),输出顾客不能用上述包装盒(每种盒子数量无限)买到麦香牛块的最大块数。如果所有购买方案都能得到满足或者不存在不能买到块数的上限,则输出0。 不能买到的最大块数(倘它存在)不超过2,000,000,000。

输入输出格式

输入格式:

第1行: 包装盒的种类数N

第2行到N+1行: 每个种类包装盒容纳麦香牛块的个数

输出格式:

输出文件只有一行数字:顾客不能用包装盒买到麦香牛块的最大块数或0(如果所有购买方案都能得到满足或者顾客不能买到的块数没有上限)。

输入输出样例

输入样例#1:

3
3
6
10

输出样例#1:

17

说明

题目翻译来自NOCOW。

USACO Training Section 4.1

思路

如果一个数k可以被凑出来,那么对于物品大小为x,k+x,k+2x,
k+3x……都可以凑出来。

那么我们不妨对所有能凑出来的方案对任意一个物品x取模,分成0到x-1一共x组。

我们现在要求出每一组方案的最小值。然后在每一组方案的最小值里取最大值,减去x,即为答案。

为什么呢?

假设每一组能凑到的方案的最小值的最大值为t,由于这个t在这一组里是最小值,那么t-x一定不能凑出来。否则t就不是最小值了。

而且由于t在所有的组中是最大值,假设t=ax+b,那么ax+0,ax+1,ax+2………ax+x-1也可以被凑出来,这x个数是其他组别里的方案或者其他组别里的方案加上整数个x得到的。但是,t-x即ax+b-x不能被凑出来(因为t是最小值),而上面的ax+y中,y如果小于b,要么ax+y可以凑出,那么对答案没影响,要么ax+y减去任意个x可以被凑出,但是肯定小于t-x;y如果大于b,那么ax+y-x一定可以凑出,否者ax+y>t,不符合条件,所以也不是最优解。

那么如何求出每一组的最小值呢?

最短路模型。

我们不妨把0到x-1建立x个点,对于每一个点,我们枚举题目给出的a[i],从x到(x+a[i])%x连一条边权为a[i]的边,表示(ax+b)%x加上a[i]变成了(ax+b+a[i])%x。

然后0的距离是0,也就是什么都不取。

从0开始跑单源最短路。

假如跑完以后出现某个点的距离减去x大于题目的上界,那么就输出0;

假如某个点到达不了,那么显然也输出0,因为这表示这一组的方案一定是凑不出来的。

排除以上可能后,假如最大距离是0,那么输出0,因为这表示所有的数都可以凑出来。

对于这个x的选择,当然是任意的,但是x的大小即为点的个数,所以x不妨选最小的那个(然而x要保证非0)。

代码

原创粉丝点击