JD3 小东分苹果

时间:2021-10-10
本文章向大家介绍JD3 小东分苹果,主要包括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 };
心之所愿,永不相忘

原文地址:https://www.cnblogs.com/zgll/p/15388967.html