公司新建一幢大厦,有很多楼层。现设计师觉得每个电梯都又所有的楼层的按钮太麻烦了,因此将电梯设计成只有两个按钮,第i个电梯有两个按钮,一个按钮uiUp,表示上升uiUp层,一个为uiDown,表示下降uiDown层。
我们假设电梯永远到不了顶层,但电梯最低为0层。所有电梯初始都在第0层。
现有共m个电梯,你可以选择其中一个,但是选取之后就不能变换电梯了,当你走进这座大楼,按n次电梯按钮后,电梯最低能够停在几层。
思路一:很自然的想法,如果现在上升的楼数大于一次能下降的楼数,则下降,反之则往上增加一次上升。代码粘帖如下:
#include <stdio.h>
#include <stdlib.h>
#define IN
#define INT int
#define UINT unsigned int
#define MIN(uiA, uiB) ((uiA) < (uiB) ? (uiA) : (uiB))
UINT computer_elevator(IN UINT uiM, IN UINT uiN, IN UINT uiUp, IN UINT uiDown);
UINT cd_elevator(IN UINT uiM, IN UINT uiN, IN UINT auiUp[], IN UINT auiDown[]);
INT main()
{
UINT auiArr[3] = {15, 15, 7};
UINT auiBrr[3] = {12, 4, 12};
printf("-----:%d\n", cd_elevator(3, 10, auiArr, auiBrr));
return 0;
}
UINT computer_elevator(IN UINT uiM, IN UINT uiN, IN UINT uiUp, IN UINT uiDown)
{
UINT uiUpSum = uiUp;
printf("uiM: %d ", uiM);
printf("up ");
uiN--;
while (0 != uiN)
{
while ((uiUpSum >= uiDown) && (0 != uiN))
{
printf("down ");
uiUpSum = uiUpSum - uiDown;
uiN--;
}
if (0 != uiN)
{
printf("up ");
uiUpSum = uiUpSum + uiUp;
uiN--;
}
}
printf("uiUpSum = %d\n", uiUpSum);
return uiUpSum;
}
//其中uiM 表示电梯数目,uiN表示按钮次数,auiUp[i]为第i个电梯一次上升的层数,auiDown[i]为第i个电梯一次下降的层数
UINT cd_elevator(IN UINT uiM, IN UINT uiN, IN UINT auiUp[], IN UINT auiDown[])
{
UINT uiTempMin = 0;
UINT uiMin = computer_elevator(1, uiN, auiUp[0], auiDown[0]);
while (1 != uiM)
{
uiTempMin = computer_elevator(uiM, uiN, auiUp[uiM - 1], auiDown[uiM - 1]);
uiMin = MIN(uiMin, uiTempMin);
uiM--;
}
return uiMin;
}
![](https://img-blog.csdn.net/20131014235028828?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvdXN0Y3p3Yw==/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center)
思路二 使用数学公式推导
auiUp * UpNum - auiDown*DownNum >=0 (1)
UpNum + DownNum = Num (2)
将 (2)式代入 (1)式中,得到 DownNum <= auiUp*Num / (auiUp + auiDown),要使上升层数最少,则DownNum最大,即刚好是最大整数,代码如下
#include <stdio.h>
#include <stdlib.h>
#define IN
#define INT int
#define UINT unsigned int
#define MIN(uiA, uiB) ((uiA) < (uiB) ? (uiA) : (uiB))
inline UINT computer_elevator(IN UINT uiM, IN UINT uiN, IN UINT uiUp, IN UINT uiDown);
UINT cd_elevator(IN UINT uiM, IN UINT uiN, IN UINT auiUp[], IN UINT auiDown[]);
INT main()
{
UINT auiArr[3] = {15, 15, 7};
UINT auiBrr[3] = {12, 4, 12};
printf("-----:%d\n", cd_elevator(3, 10, auiArr, auiBrr));
return 0;
}
inline UINT computer_elevator(IN UINT uiM, IN UINT uiN, IN UINT uiUp, IN UINT uiDown)
{
UINT uiDownTime = uiUp * uiN / (uiUp + uiDown);
return uiUp * (uiN - uiDownTime) - uiDown * uiDownTime;
}
UINT cd_elevator(IN UINT uiM, IN UINT uiN, IN UINT auiUp[], IN UINT auiDown[])
{
UINT uiMinTemp = 0;
UINT uiMin = computer_elevator(1, uiN, auiUp[0], auiDown[0]);
while (1 != uiM)
{
uiMinTemp = computer_elevator(uiM, uiN, auiUp[uiM - 1], auiDown[uiM - 1]);
uiMin = MIN(uiMin, uiMinTemp);
uiM--;
}
return uiMin;
}