题目描述:
小米兔每天都要去公共浴室洗澡,但是有时候公共浴室人太多,需要排队,小米兔想知道它什么时候能洗澡,你可以帮他算算他要多久才能洗完澡吗?
公共浴室最多可同时容纳 n 个人洗澡,每个人洗澡的时间为k分钟,多余的人只能在外面排队等候。(ps:保证不会有插队现象出现)
小米兔在第a时刻准备好去公共浴室洗澡,问小米兔什么时候才能洗完澡(初始状态:公共浴室为空)。
注意:如果有和小米兔同一时刻去公共浴室的。小米兔排到该时刻全部人的后面。(因为小米兔会礼让)
输入描述:
第一行三个整数n, k, q(1≤ n ≤100,1≤ k ≤50,1≤ q ≤ 1e5)
第二行q组整数(每组两个整数x,y代表在x时刻有y人去澡堂洗澡,1≤ x ≤1e5,1≤ y ≤100 )
第三行一个整数a(a含义如上)
输出描述:
输出小米兔洗完澡的时刻,每组输出占一行。
输入样例:
2 5 3
1 1 2 1 3 1
4
输出样例:
12
思路
由于同一时刻去公共浴室的,小米兔排到该时刻全部人的后面,所以问题可转化为a时刻之前(包括a时刻)的人全部洗完所需时间。
分别用两个队列模拟等待区wait和洗澡区wash,有人来了即进入wait;wash小于n即可由等待区进入wash;wash队首洗澡时间等于k即出对;模拟每个时刻直到两个队列为空并且时刻大于a。
更多题解请关注 doubleQ2018’s GitHub
ac代码
#include <bits/stdc++.h>
using namespace std;
vector<int> tp(1e5+1, 0);
struct people{
int arr, wa;
people(int a, int b): arr(a), wa(b) {}
};
int main(){
int n, k, q;
cin >> n >> k >> q;
for(int i = 0; i < q; i++) {
int x, y;
cin >> x >> y;
tp[x] += y;
}
int last;
cin >> last;
tp[last]++;
int i = 1;
queue<people> wash, wait;
for(;; i++){
//cout << i << endl;
while(!wash.empty() && i - wash.front().wa == k) wash.pop();
int num = tp[i];
while(i <= last && num--) wait.push(people(i, -1));
while(wash.size() < n && !wait.empty()) {
wait.front().wa = i;
wash.push(wait.front());
wait.pop();
}
if(i > last && wash.empty() && wait.empty()) break;
}
cout << i << endl;
}
更多题解请关注 doubleQ2018’s GitHub