面试荣耀,一个算法题,很简单,当时竟然没给写出来。ε=(´ο`*)))唉,大意了,大意了,没有闪。
题目
部门聚餐,下大雨,要将所有人从食堂运到办公室。
现在由大伞和小伞,小伞一次撑2个人,大伞一次撑3个人
在最开始时食堂的人有一把小伞,办公室里有n把小伞,m把大伞。
从办公室到食堂的往返时间为2小伞,去1h,回1h。
每个人一次只能带一把伞。
求所有人回到办公室的最短时间。
输入:
一个数字T,T组数据
每组为c n m,代表人数,小伞数,大伞数
测试用例:
2
1 1 1
3 1 1
c=11 n=1 m=2 标答为9
我的答案是5
public static int sendUmbrella(int c, int n, int m) {
int leftNum = 0; //已经离开的人数,到达办公室人数。
int smallUmbrella = 1; //食堂里有的小伞数量
int bigUmbrella = 0; //食堂里有的小伞数量
int costHour = 0;
while (true) {
leftNum += smallUmbrella * 2 + bigUmbrella * 3;
costHour++;
if (leftNum >= c) {
break;
}
if ( (leftNum * 2) <= m){//大伞很充足,所有的人都带不完,看有多少人,就带多少伞
bigUmbrella = leftNum *2;
}else{// 大伞不足,依据有多少大伞就带多少
bigUmbrella = m;
if ((leftNum * 2) <= n+m+1){//小伞很充足,所有的人都带不完,看有多少人就带多少伞
smallUmbrella = (leftNum * 2 ) - m;
}else{//小伞也不足,依据有多少伞就带多少
smallUmbrella = n+1;
}
}
costHour++;
leftNum = leftNum - (bigUmbrella+smallUmbrella)/2;
}
return costHour;
}
网友评论