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;//返回总秒数
}
};