C语言,猴子背香蕉问题怎么解决总共100个香蕉50米上限拿50个每走一米吃一个回去不吃

Python011

C语言,猴子背香蕉问题怎么解决总共100个香蕉50米上限拿50个每走一米吃一个回去不吃,第1张

假设猴子往前走x米,把一部分香蕉转移到x米处,留x个香蕉路上吃,然后折返,重复如此,把所有香蕉先搬到x米处,显然每次搬运会浪费2x个香蕉,最后一次浪费x个,由此易知搬运的次数越少越好,我们定为2次,那么每次浪费3x个香蕉,还剩100-3x个香蕉,还需要走50-x米,显然剩下的路一次走完要更优,那么最后留下的香蕉数是 min(100-3x,50)-(50-x) 求个最大值 易知为x=17时 原式求值为16

#include<stdio.h>

void main()

{ int n,b,s//n总灯数,b开始数的灯号,s间隔

int a[256],i,k,m,p//a存放灯号,k当前数到位置,m当前数到亮灯计数,p熄灭灯数

scanf("%d%d%d",&n,&b,&s)if ( n>256 ) n=256//约数最多256盏灯

for ( i=0i<ni++ ) a[i]=i//灯号赋值

k=bm=sp=0

while ( p<n ) //当还有灯没有熄灭时循环

{ if ( m==s ) { printf("%d ",a[k])a[k]=(-1)p++m=0} //数到了,输出位置,标记熄灭

else { do { k++k%=n} while ( a[k]<0 )m++} //向后数并折返,只有亮的灯m才计数

}

printf("\n")

}

标准C中没有reverse()函数

这是C++的一个新增函数

template<class BidirectionalIterator>

void reverse(

BidirectionalIterator _First,

BidirectionalIterator _Last

)

需要引用头文件

#include <algorithm>

命名空间:std