zoukankan      html  css  js  c++  java
  • 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 };
    心之所愿,永不相忘
  • 相关阅读:
    SQL SERVER使用技巧集
    WIN32串口编程
    经典FLASH收藏
    Windows下WinsockAPI研究
    数据库连接大全[转自中国站长网]
    VirtualBox自动重启之谜
    写个设置命令的VBS脚本工具。
    VB中KeyCode的取法
    实现串口编程的三种方法
    .NET的命名空间
  • 原文地址:https://www.cnblogs.com/zgll/p/15388967.html
Copyright © 2011-2022 走看看