1.题目
Time Limit: 1000 ms Memory Limit: 65536 KiB
Problem Description
老猴子辛苦了一辈子,给那群小猴子们留下了一笔巨大的财富——一大堆桃子。老猴子决定把这些桃子分给小猴子。
第一个猴子来了,它把桃子分成五堆,五堆一样多,但还多出一个。它把剩下的一个留给老猴子,自己拿走其中的一堆。
第二个猴子来了,它把桃子分成五堆,五堆一样多,但又多出一个。它把多出的一个留给老猴子,自己拿走其中的一堆。
后来的小猴子都如此照办。最后剩下的桃子全部留给老猴子。
这里有n只小猴子,请你写个程序计算一下在开始时至少有多少个桃子,以及最后老猴子最少能得到几个桃子。
Input
输入包括多组测试数据。
每组测试数据包括一个整数n(1≤n≤10)。
输入以0结束,该行不做处理。
Output
每组测试数据对应一行输出。
包括两个整数a,b。
分别代表开始时最小需要的桃子数,和结束后老猴子最少能得到的桃子数。
Sample Input
5
1
0
Sample Output
3121 1025
1 1
2.正确代码
#include <iostream>
using namespace std;
int main()
{
long long arr[12],sum;
int n,i;
while(cin >> n && n)
{
sum=0;
i=n;
for(i=1;i<=n;i++)
arr[i]=1;
while(i>=1)
{
if(n!=1)
arr[n]+=5;
for(i=n-1;i>=1;i--)
{
if(arr[i+1]%4==0)
arr[i]=arr[i+1]*5/4+1;
else
break;
}
}
sum=n+arr[n]/5*4;
cout << arr[1] << ' ' << sum << ' ' << arr[n]<<endl;
}
}
return 0;
3.解题思路
我们首先要保证最后一个猴子分桃的时候能分配到,我们再去保证前面的猴子分桃能分到。
其次,你要明白一个概念,到低是谁推谁,这种逻辑不能乱。
1.我们要保证[x]*5/4+1=[x-1],且[x-1]%5==1那么必须保证[x]是4的倍数,即前面一定是4的倍数才能达到这种效果。
2.其次,我们要保证最后一个一定可以分配,分配的结果我们不用管,只要保证[x-1]%5==1,所以,如果是这样的话,x=1,6,11,····(+5)
好,现在我们来理清一下思路,我们需要填充好x[i]的,我们先判断其上一个x[i+1]是否符合递推条件,如果符合,则对x[i]填充;否则,则不填充。
一旦选择不填充,那么说明我们开始的数字不符合要求,我们要对其继续增加直到全部符合相关标准为止。
要用严格的数学思维来解题,不能光靠直觉来得出所以然,也不能光靠带数来尝试,要靠严格的数学证明和严谨的逻辑!
本文通过解析猴子分桃问题,介绍了一个使用C++实现的算法解决方案。该问题要求计算初始桃子数量及最终剩余桃子数量,适用于n只猴子依次进行相同分桃操作的情况。文章提供了完整的代码示例及详细的解题思路。
1109

被折叠的 条评论
为什么被折叠?



