荣耀算法面试题-送伞最小时间

面试荣耀,一个算法题,很简单,当时竟然没给写出来。ε=(´ο`*)))唉,大意了,大意了,没有闪。

题目

部门聚餐,下大雨,要将所有人从食堂运到办公室。
现在由大伞和小伞,小伞一次撑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;
    }

你可能感兴趣的:(荣耀算法面试题-送伞最小时间)