class Solution {
public:
    /**
     * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
     *
     * 
     * @param tickets int整型vector 
     * @param k int整型 
     * @return int整型
     */
    int timeRequiredToBuy(vector<int>& tickets, int k) {
        // write code here
	  /*本题情景应该这样理解:有一家电影院,有n个人在排队买票,第i个人需要买ai张票,
	  每人每次只能买一张票,然后到队尾重新排队,买完自己想要的票后就出队。每人每次买票
	  耗时一秒
	  
	  现在你需要关注第k个人,计算他买完票后时间过了多少秒*/
	  
	  //思路就是设置两个队列,分别记录第i个人需要买多少张票以及他对应的序号,
	  //每当第k个人买票后,他所对应的剩余票数减一,当这个人剩余票数减完以后结束买票,计算总时长
	  
	  
        int sec{};//定义总的秒数
        queue<int> w,ptr;//定义两个队列

        for(int i=0;i<tickets.size();i++)
        {
            w.push(tickets[i]);
            ptr.push(i);//分别为两个队列赋上第i个人的票数以及其对应序号
        }

        while(tickets[k]!=0)//只要第k个人的票数没买完,循环继续
        {
            if(!w.empty()&&w.front()>1)//先检查是否空队列,这是好习惯
			  //如果这个人剩余票数大于1,往下走
            {
                int temp=w.front()-1;//人物票数减,并且移至队尾
                w.push(temp);
                w.pop();
                if(ptr.front()==k)//如果这个人是第k个人,则第k个人对应票数减一
                {
                    tickets[k]--;
                }
                ptr.push(ptr.front());//将人物指针移至队尾,保持对应
                ptr.pop();
            }
            else if(!w.empty()&&w.front()==1)//如果人物只剩一张票,进入另一种情况
            {
                if(ptr.front()==k)//如果这个人是第k个人,秒数加一退出循环
                {
                    tickets[k]--;
                    sec++;
                    break;
                }
                w.pop();//一般情况则将此人出队
                ptr.pop();
                
            }
            sec++;//循环末端秒数加一
        }
        
        return sec;//返回总秒数

    }
};