版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。
32 篇文章0 订阅
订阅专栏
智力题
啤酒2元1瓶,4个瓶盖换1瓶,2个空瓶换1瓶,
问10元钱可以喝几瓶
下面是百度知道txt998的回答:
1.10元买5瓶啤酒,喝完后,有5个空瓶和5个盖;
2.4个空瓶换2瓶啤酒,4盖换1瓶啤酒,剩下1个空瓶和1个盖,喝完后,有4个空瓶和4个盖;
3.4个空瓶换2瓶啤酒,4盖换1瓶啤酒,喝完后,有3个空瓶和3个盖;
4.2个空瓶换1瓶啤酒,喝完后,有2个空瓶和4个盖;
5.2个空瓶换1瓶啤酒,4盖换1瓶啤酒,喝完后,有2个空瓶和2个盖;
6.2个空瓶换1瓶啤酒,喝完后,有1个空瓶和3个盖;
7.借1瓶啤酒,喝完后,有2个空瓶和4个盖;换2瓶啤酒,还1瓶,还剩1瓶
8.借1瓶啤酒,2瓶喝完后,有2个空瓶和2个盖;换1瓶啤酒还上,还剩2个盖;
9.借2瓶啤酒,喝完后,有2个空瓶和4个盖;换2瓶啤酒还上,不再剩下瓶和盖。
所以共有:5+3+3+1+2+2+1+1+2=20
拉吉,算的这么复杂,瓶盖值5毛,瓶子值1元,啤酒就只值五毛,10元直接和20瓶了
这个思维是如果能"吃干榨净"就直接得结果了
分析图:
我的代码中间换啤酒的有几处数量不一样,但是结果一样,如下:
/*智力题啤酒2元1瓶,4个瓶盖换1瓶,2个空瓶换1瓶,问10元钱可以喝几瓶*/ #includeint ping, P, G;//整瓶,瓶子,瓶盖 int sum = 10, price = 2; int ans = 0; void jiejiu(int ping, int G, int P); void main() {	ping = sum / price;	ans += ping;	G = ping;	P = ping;	ping = 0;//被分解出瓶子和瓶盖了	for (; G >= 4 || P >= 2;)	{	ping = G / 4 + P / 2;	ans += ping;	G = G % 4 + ping;//每个整瓶有一个瓶盖和一个瓶子	P = P % 2 + ping;	ping = 0;//分解后	//printf("%d\n", ans);	}	//吃干榨净,借酒!!	jiejiu(ping, G, P);	printf("%d\n",ans); } void jiejiu(int ping, int G, int P) {	if (G == 2 && P == 0) { ans += 2; return; }//再无别的可能,借2瓶还2瓶再无瓶盖瓶子	if (G == 3 || P == 1)//任意一种都有能力借一瓶还一瓶	{	ping = ping + 1;//借1整瓶	ans += ping;//喝酒取瓶,喝完才能分解	G = G + ping;	P = P + ping;	ping = G / 4 + P / 2;//兑换	ping = ping - 1;//还1整瓶	ans += ping;//结算还后的喝到的瓶中啤酒	G = G % 4 + ping;	P = P % 2 + ping;	ping = 0;//分解后	//printf("%d\n", ans);	jiejiu(ping, G, P);	}	return ; }