█▉人和猴子分配椰子问题
大侠们帮忙看看,程序没错,不错超时,小弟菜鸟一个,不晓得怎样改进下才不超时?
题目大意: 故事讲述了五男一 猴子在一个岛屿上。他们度过了第一晚采收椰子。在夜间,一名男子醒来,并决定拿走他那一份椰子。他分为五个份。椰子剩下来一个,他把它给猴子,然后藏起他的份额,回去睡觉。
不久另一名男子醒来后,也做了同样的事情。经过划分为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;
}