题目

下课了,牛牛要去食堂吃饭,他们学校的食堂有很多个门,而且整个建筑物是圆形的。只不过要去吃饭的人很多,在里面吃饭的人也很多,所以大家都在门口外面排队等待吃饭。

所以牛牛采取了这样的一个策略:
刚开始时,牛牛在第一个门口,如果这个门口有人在排队,那么他选择花费 1 分钟时间走到下一个门口,如果没有人的话,牛牛就可以直接进去吃饭啦。
食堂的每一个门,每 1 分钟排队的人数都会减少一个。

现在给出门的数量 ,和每个门外排队的人的数量,如果按照牛牛的策略,那么牛牛最终会在哪个门进去吃饭呢?

解题思路

牛牛在第 1 门开始进行第 1 轮排队, 分钟后,每个门口排队的人都会减少 个人(如果有这么多人的话),
如果到达某个门口排队人数为 0(),就在这个门进去吃饭,返回门的编号。

如果牛牛在经过了第一轮后,没有遇到排队人数为 0 的门口,他重新走到第 1 个门口开始第 2 轮的排队。
此时,经过了 1 轮后,第 1 个门的排队人口是 ,而每经过 1 轮,第 1 个门口总会减少 个人。其他门口也是这样。

因此,可以通过计算每个门要经过多少轮排队后门口人数清零,来判断牛牛在哪个门进去。
选择清零轮数最少的门进入,如果清零轮数相同,那么选择编号小的门进去。

C++代码

class Solution {
public:
    /**
     * 返回牛牛最终是从第几个门进入食堂吃饭的
     * @param n int整型 代表门的数量
     * @param a int整型vector 代表每个门外等待的人数
     * @return int整型
     */
    int solve(int n, vector<int>& a) {
        // write code here
        int cnt = 0;
        for(int i=0; i<n; ++i){
            a[i]-=cnt;
            if(a[i]<=0) return (i+1);
            ++cnt;
        }
        int minCycle = 1e9;
        int minIndex = 0;
        for(int i=0; i<n; ++i){
            int tmp = a[i]/n;
            if(a[i]%n) ++tmp;
            if(tmp < minCycle){
                minCycle = tmp;
                minIndex = i;
            }
        }
        return (minIndex+1);
    }
};