问个问题~
usrbin吧
全部回复
仅看楼主
level 6
有n个渔夫去打渔,他们一共打了多少鱼不知道。不过分鱼的时候,首先第1个渔夫先去分,他把A1只鱼从所有的鱼里边扔掉,使得剩下的鱼是n的倍数,然后他拿走属于他的1/n。第2个渔夫也扔掉A2只鱼,由于他不知道第1个渔夫拿了鱼了,他也拿走剩下的1/n。...(每个渔夫都不知道之前鱼有被分掉)...第n个渔夫扔掉An只鱼,然后拿了剩下的1/n。
现在给你n和A1...An,问他们最少打了多少只鱼。
给个例子吧,比如n=3,A1=1,A2=0,A3=2,这时他们最少打了19只鱼。
@usrbin

2011年07月18日 15点07分 1
level 11
数据范围?国际惯例啊
2011年07月18日 16点07分 2
level 6
= = 我本来以为是个数学题的~所以就没给了
N<=2000,0<=Ai<N
2011年07月19日 05点07分 3
level 11
建立递推式Si=S(i+1)/(n-1)*n+Ai(1≤i≤n,Si>0),S(n+1)即最后剩下的鱼的数目,要求(n-1)|Si(i>1)并且S1最小(S1就是最后的答案),那么S(n+1)取最小即可。变形Si=S(i+1)/(n-1)*(n-1)+S(i+1)/(n-1)+Ai,即要求(n-1)|S(i+1)/(n-1)+Ai(i>1),即要求
(n-1)^n|S(n+1)+(n-1)An+(n-1)^2*A(n-1)+……+(n-1)^(n-1)*A2(想想为什么?)
我们只需要找到最小的S(n+1)即可
由Ai≤n-1=>∑Ai(n-1)^(n-i)≤∑(2≤i≤n)(n-1)^i<2*(n-1)^n(n≥3),因此S(n+1)最小值只需要简单的加减法即可000求得。然后再逆推出S1即可。算法复杂度O(n)(大数的加减乘除视作O(1))

2011年07月19日 06点07分 4
level 6
大致明白了,我再想想
2011年07月20日 11点07分 5
1