█▉人和猴子分配椰子问题

buyaozaiwangji 2009-05-30 10:49:21
侠们帮忙看看,程序没错,不错超时,小弟菜鸟一个,不晓得怎样改进下才不超时?
题目大意: 故事讲述了五男一 猴子在一个岛屿上。他们度过了第一晚采收椰子。在夜间,一名男子醒来,并决定拿走他那一份椰子。他分为五个份。椰子剩下来一个,他把它给猴子,然后藏起他的份额,回去睡觉。

不久另一名男子醒来后,也做了同样的事情。经过划分为5份椰子,剩余一个给猴子,拿走自己的,又回到床上。第三,第四和第五名男子一样。第二天早上,他们都醒了,他们剩下的椰子分成五个平摊。这一次没有椰子被遗留下来的。

问题要输入一个N,表示椰子个数,让求P,最大的人数能满足这个条件,分P此,每次正好剩一个给猴子,最后一次省的个数正好是人数的倍数


代码:
超时了~~
//完成时间:2009年5月29日22:36:39,ps,本程序可以改进,主要是p,不用搞到N+1,不过该是几我也不知道
#include<iostream>
using namespace std;

int Fenpei(int N)
{
int p;
int yes;//记录当前椰子个数是否符合标准
int i;
int max=1;
for(p=N-2;p>1;p--)//p不应该是N-1以上的
{
int *n=new int [p+1];//第0个存放初值
int *s=new int [p+1];//n,s分别表示第k次拿走的 椰子数,拿走后剩余数
n[0]=0;
s[0]=N;
yes=1; //复位
i=1; //复位
while(i<=p)//有p个人,就拿走p次
{
if((s[i-1]-1)%p != 0)//上次剩余个数无法表示成5K+1的形式,无法分配
{
yes=0;
break;
}
else
{
n[i]=(s[i-1]-1)/p;
s[i]=s[i-1]-n[i]-1;//------------注意,每次拿走还给了猴子一个
}
i++;
}
if(yes==1 && s[p]%p ==0)//每次都能 正确拿走,最后剩下s【p】还能平均p等分
{
cout<<N<<" coconuts, "<<p<<" people and 1 monkey"<<endl;
return 1;
}
delete n;
delete s;

}
cout<<N<<" coconuts, no solution"<<endl;
return 0;

}
int main()
{
int num;
while( cin>>num && num!= -1)
{
Fenpei(num);
}
return 0;
}
...全文
496 6 打赏 收藏 转发到动态 举报
写回复
用AI写文章
6 条回复
切换为时间正序
请发表友善的回复…
发表回复
光宇广贞 2009-05-30
  • 打赏
  • 举报
回复
而 Sum( p^i, i = 1 : p-1 ) = ( p^p - p ) / ( p - 1 ) 的。

所以你用什么循环啊,直接代进这个式子里面算就完了!
光宇广贞 2009-05-30
  • 打赏
  • 举报
回复
首先,应该可以判断

p^p > p + p^2 + p^3 + .... + p^(p-1) 的,对吧。

那么,p + p^2 + p^3 + .... + p^(p-1) < n / 2

所以说,p 可以取的范围很小,对吧。
光宇广贞 2009-05-30
  • 打赏
  • 举报
回复
Fenpei(num)函数里面是两层循环,主函数还一个 while 三层循环,尽管你最外层那个while其实算不上复杂度,但谁知道它怎么判断呢。

去了这层while,然后

f(n<0>) = n;
f(n<i+1>,p) = (f(n<i>)-1) / p; 0 <= i < p;
f(n<p>,p) = f(n<p-1>) / p;

这样一个过程。

如果代入 n + 1 的话,那么 f(n<p>,p)就可以并入第二式.

f(n<0>) = n'; n' = n + 1;
f(n<i+1>,p) = (f(n<i>)-1) / p; 0 <= i <= p;
变成这样了对吧。

这就不是一个迭代么。解一下这个迭代过程:
设 f<i> = f(n<i>, p)。

f<0> = 1 + p + p^2 + p^3 + .... + p^p*f<p> = n + 1

n = p + p^2 + p^3 + .... + p^p*f<p>

让 f<p> 最小,p最大
buyaozaiwangji 2009-05-30
  • 打赏
  • 举报
回复
没人up?
wesweeky 2009-05-30
  • 打赏
  • 举报
回复
mark

upup
光宇广贞 2009-05-30
  • 打赏
  • 举报
回复
http://blog.csdn.net/hikaliv/archive/2009/05/30/4225660.aspx

看看这个。

64,636

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧