Logic-算法-分金条/五个好朋友分苹果

来源:互联网 发布:网络直播教育 编辑:程序博客网 时间:2024/04/28 15:59

原作者:ylbtech
出处:http://ylbtech.cnblogs.com/

1.你让一些人为你工作了七天,你要用一根金条作为报酬。金条被分成七小块,每天给出一块。

如果你只能将金条切割两次,你怎样分给这些工人?

分析:
1,一共七天=一根金条;
2,只允许你将金条切割两次;
3,每个人必须每天得到报酬;
 
 
解析步骤:
无为法【我们在分割之前先同一单位,一根金条=均等的七等分】
1,
第一天:我们先切金条的七分之一给工人。
2,
第二天:剩下的七分之六,该怎么起这一刀哪?这一刀这关重要。
这六块我们采用:枚举法 (1:5;2:4;3:3)
我们可以用1:5或者2:4,可以正常报酬。
2_1,采用1:5分发,我们在给工人一块一等分的。
2_2,采用2:4分发,我们给工人一块二等分的,工人再找一块一等分的。
3,
第三天:假设我们依旧采用1:5分发,我们发现没有办法在往下发工资。现在只有2:4分发,到底是这种分发吗?我们还得继续往下看。
我们把(2_2)工人回找的一等分一块金条给工人。
4,
第四天:
我们把四等分的金条给工人,让他在回找3等分的金条。
5,
第五天:我们在给工人一个一等分的金条。
6,
第六天:我们在给工人一个二等分的金条,让他回找一个一等分的金条。
7,
第七天:我们在给工人一个一等分的金条。
 
总结:
金条分割的比例是1:2:4
 
扩展
二、你让一些人为你工作了15天,你要用一根金条作为报酬。金条被分成15小块,每天给出一块。
如果你只能将金条切割3次,你怎样分给这些工人?
 
切为1 2 4 8
 
三、你让一些人为你工作了31天,你要用一根金条作为报酬。金条被分成31小块,每天给出一块。
如果你只能将金条切割4次,你怎样分给这些工人?
 
切为1 2 4 8 16
————————————————————————————————————

 一个猎人带着一只羊,一只狼和一颗白菜回家,路上遇到一条河。河边只有一条船,但船太小,一次最多只可载猎人和另一样东西过河。但猎人不在时,狼要吃羊,羊要吃白菜。请问怎样才能把狼、羊、白菜都安全过河?

——————————————————————————————————————

 有八个正方形的箱子,外观大小都一样,其中七个是50斤的,一个是45斤的,还有一个天平,请问你最少用几次天平可以找出45斤的箱子?

2次即可。
第一步:先任意拿出六个箱子,天平两侧各方3个。
第二步:第一步的结果有两种:
1,天平依旧平衡,则45斤的在剩下的箱子里;把剩下的箱子再放到天平两侧,抬起的一头就是45斤的箱子。
2,天平不平衡,我们把抬起的三个箱子,其中的两个再放到天平上。2_1,天平平衡,剩下的就是45斤的;
2_2,天平倾斜,抬起的那一侧就是45斤的。
____________________________________________________________
 五个好朋友分一堆苹果,第一个人把苹果分成5份,为了公平,扔掉了多余的1个苹果,拿上自己一份走了。第二人来了,把剩余的苹果分成5份,扔掉多余的1个,拿上自己一份走了。以后来的三个人都是这样做的。那么,最初有多少个苹果呢?
 
分析:
    根据分苹果的方法我们可以看出,每个人分苹果时都是扔掉1个后变成了5的整数倍,所以才能分成5份。那么当这个人拿去一份后,剩余的是4份苹果,所以剩余的数一定是4的整数倍。所以,每个人所看到的数目一定是减1后,既是5的整数倍,又是4的整数倍。因此可构建为:1+4+5+X(X为未知的正整数或0)。
    设m为第i个人所看到的苹果数,n代表第i-1个人所看的到苹果数,那么这两个数字应该满足这样的关系:m=(n-1)/5*4
    例如当i=2时,代表第2个人所看到的苹果数=(第一个人看到的苹果数减去1个,再分成5份,因为第一个人拿走1份,所以乘以4份)。所以,这个表达式成立。
    因此m和n都应该满足1+4*5*X这个表达式。这是一个二重循环,外循环不能确定执行多少次,只好总最小数21开始试算。内循环判断苹果数是否能被5整除,如果不能被整除则退出内循环,外循环的苹果数直接加20。因为20是满足既能被5整除,又能被4整除的最小数。
   从1开始的原因1是最小的满足1=1+4*5*X的正整数(当X为0时)。
 int i, m, n = 1;            for (; ; )            {                n = n + 4 * 5;                m = n;                for (i = 0; i < 5; i++)                {                    if ((m - 1) % 5 != 0)                        break;                    else                        m = (m - 1) / 5 * 4;                }                if (i == 5)                    break;            }            Console.WriteLine(string.Format("原来有{0}个苹果!",n));
____________________________________________________________
果园里有一堆桃子和一只猴子,这只猴子第一天把桃子吃了一半,又扔了一个坏掉的桃子;第二天又吃了现有的一半,又扔了一个坏桃子;第三天、第四天、第五天、第六天都是这样。到第七天只剩下一个桃子了。请问果园里最初有多少个桃子?
迭代法:
分析:        /// 变量:curSum今天剩余桃子数量        /// 我们采用“反推法”        /// 第一天 1=1        /// 第二天 4=2*(1+1)        /// 第三天 10=2*(4+1)        /// 第四天 22=2*(10+1)        /// 第五天 46=2*(22+1)        /// 第六天 94=2*(46+1)        /// 第七天 190=2*(94+1)
int i, sum=1;            for (i = 1; i <= 7; i++)            {                if (i == 1)                {                    sum = i;                }                else                {                    sum = 2*(sum + 1);                }            }            Console.WriteLine("果园里最初有{0}个桃子!",sum);


warn作者:ylbtech
出处:http://ylbtech.cnblogs.com/
本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。


0 0
原创粉丝点击