题面:
一个小猴子边上有100根香蕉,它要走过50米才能到家,每次它最多搬50根香蕉,(多了就被压死了),它每走1米就要吃掉一根,请问它最多能把多少根香蕉搬到家里。
提示:他可以把香蕉放下往返的走,但是必须保证它每走一米都能有香蕉吃。也可以走到n米时,放下一些香蕉,拿着n根香蕉走回去重新搬50根。
题解:
现在有S香蕉,要运L米。
每次带满香蕉,往前走1米,放下所有香蕉,回头1米,轮流这样怒运,就能花x个香蕉把所有香蕉往前挪1米,香蕉变成S2,问题转化成 有S2香蕉要运(L-1)米。
于是就这样暴力狂运,每次判断一下直接冲到终点能剩下多少个香蕉。
代码:
#include<stdio.h>
#define max(a,b) ( ((a)>(b)) ? (a):(b) )
#define min(a,b) ( ((a)>(b)) ? (b):(a) )
int main() {
int ans=0, bring, cnt;
int t,s,l;
///t为最大携带数 s为香蕉总数 l为总路程
printf("请分别输入香蕉总数,离家路程,最大携带量:\n");
scanf("%d%d%d",&s,&l,&t);
ans=max(ans,min(s,t)-l);
while(s>0) {
cnt=s;
s=0;
///1米往返抽搐运动往前怒运全部香蕉
while(cnt>0) {
bring = min(t,cnt);
s+=bring-1;
cnt-=bring;
if(cnt>2)cnt--;
else break;
}
l--;
printf("还剩%d距离,有%d香蕉,直接冲过去能带%d个\n",l,s,min(t,s)-l);
ans = max(ans , min(t,s) - l);
if(s<=t)break;
}
if(ans<=0)printf("\n猴子带不回香蕉");
else printf("\n猴子最多能带回%d个香蕉\n",ans);
getch();
}
(今天同学找我做这个逗题,居然有这么逗的题,猴子运香蕉!我就贴到这个不用的逗博客好了)
(这题网上搜到的那个代码我都怕得飞起来,C语言居然能写成这样,
for(;++i;)
if(t<=i*(2*n-1))break;
卧槽,++i写在for的中间位置,这不是写条件的地方吗!然后条件居然放到循环里用if,我都看醉了,简直能排上史上十大最逗for循环之一