小米OJ 143. 小米兔洗澡澡

题目描述:

小米兔每天都要去公共浴室洗澡,但是有时候公共浴室人太多,需要排队,小米兔想知道它什么时候能洗澡,你可以帮他算算他要多久才能洗完澡吗?

公共浴室最多可同时容纳 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

  • 3
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值