JD3 小东分苹果
描述
果园里有一堆苹果,一共n头(n大于1小于9)熊来分,第一头为小东,它把苹果均分n份后,多出了一个,它扔掉了这一个,拿走了自己的一份苹果,接着第二头熊重复这一过程,即先均分n份,扔掉一个然后拿走一份,以此类推直到最后一头熊都是这样(最后一头熊扔掉后可以拿走0个,也算是n份均分)。问最初这堆苹果最少有多少个。
给定一个整数n,表示熊的个数,返回最初的苹果数。保证有解。
思路:
采用DP的思想,按照轮数从后往前推导,设最后一轮的分配前剩x个苹果,那么倒数第二轮分配前剩下的苹果为n/(n-1)*x+1
最关键的就是这个x的确定了,因为这个x需要保证每轮的分配都均匀分配(能够整除n),没办法,只能逐个测试了:
1 class Apples { 2 public: 3 int getInitial(int n) { 4 // write code here 5 // 设dp[i]表示从后往前,第i轮的剩下的苹果数,可得 6 // dp[i]=dp[i-1]*n/(n-1)+1 但是dp[0]怎么确定呢? 7 // 那就一个个试吧 8 int res=0; 9 int init=1; // 从最后剩下一个开始 10 vector<int> dp={n,0}; 11 int i=1; 12 while(1){ 13 dp[0]=init; 14 int i; 15 for(i=1;i<n;++i){ // 判断当前init值是否是正确的 16 if(dp[i-1]%(n-1)==0){dp[i]=dp[i-1]*n/(n-1)+1;} 17 else{ 18 init=n+init; // 更换下一个init值 19 dp[0]=init; 20 break; 21 } 22 } 23 if(i==n) break; 24 } 25 return dp[n-1]; 26 } 27 };
心之所愿,永不相忘