题目
下课了,牛牛要去食堂吃饭,他们学校的食堂有很多个门,而且整个建筑物是圆形的。只不过要去吃饭的人很多,在里面吃饭的人也很多,所以大家都在门口外面排队等待吃饭。
所以牛牛采取了这样的一个策略:
刚开始时,牛牛在第一个门口,如果这个门口有人在排队,那么他选择花费 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); } };