猴子分桃问题

2017-12-02  本文已影响0人  敲可爱的小超银

一、顺推方法

用循环遍历可能的桃子总数,最开始为队员总数加一,满足1.(sum-1)%n==0 并下一次分桃时sum的值变为((sum-1)/n)*(n-1)

每个队员所面对的(上一个留下的)桃子数都可以实现分配即可,用k计数来实现,如不满足条件1跳出循环将桃子数+队员数再进行遍历。

最后对k进行判断如果k不等于队员数,同样需要更新桃子数进行再次循环,此时上次循环中的部分变量值需更新,比如k;

注意:sum的值属于每次循环的可变值,变为分配完的桃子数,需要变量x来进行桃子数+队员数

记得最后的总数因为多加了一次队员数,所以需要减去

#include<iostream>

using namespace std;

int sum;

void pitch(int n)

{

int k=0;

int x = n + 1;

while (k != n)

{

k=0;

sum = x;

for (int i = 0; i < n; i++)

{

if ((sum - 1) % n == 0&&sum!=1)

{k++;}

else {break;}

sum = ((sum - 1) / n)*(n - 1);

}

x += n;

}

cout << x- n <<" "<<sum<<endl;

}

int main()

{

int n;//队员人数

while (scanf_s("%d", &n) != EOF)

{

pitch(n);

}

system("pause");

return 0;

}

递推法实现

bool check_num(int num,int k=1){ //k标志面临桃子数可分的猴子数

if((num-1)%5!=0)return false;

if(k==5)return true;

return check_num((num-1)*4/5,++k);

}

int pitch_num(){ //返回满足条件的S1

for(int i=6;;i+=5)

if(check_num(i))return i;

}

二、逆推法

第n个面对的桃子数可分且sum%4==0即可,k作为计数判断,k!=n-1,因为前面判断过一次第n个是否可分,并且式子变为(sum/(n-1))*m+1;根据互相的递推关系不用判断是否可余5,并且每次循环变量值变化为+4.

ps.在程序开头加上#define _CRT_SECURE_NO_WARNINGS或者#pragma warning(disable:4996),可关闭安全检查,当然在oj上要去掉

上一篇 下一篇

猜你喜欢

热点阅读