AcWing 5283. 牛棚入住

贝茜经营的牛棚旅店中有 a 个可供一头牛入住的小牛栏和 b

个可供两头牛入住的大牛栏。

初始时,所有牛栏都是空的。

已知,今天一共有 n

波奶牛依次前来入住,每波由 1∼2

头奶牛组成。

如果是一头奶牛前来入住,那么:

  1. 如果有空着的小牛栏,则安排其在空着的小牛栏入住。
  2. 如果没有空着的小牛栏,则安排其在空着的大牛栏入住。
  3. 如果既没有空着的小牛栏,也没有空着的大牛栏,则安排其在仍未住满的大牛栏入住。
  4. 如果上述都没有,则将其劝离。

如果是两头奶牛前来入住,那么:

  1. 如果有空着的大牛栏,则安排它们在空着的大牛栏入住。
  2. 如果没有空着的大牛栏,则将它们劝离。

请你计算,一共有多少头奶牛会被劝离。

注意,问题是被劝离的奶牛具体数量,而不是波数。

输入格式

第一行包含三个整数 n,a,b

第二行包含 n

个整数 t1,t2,…,tn,其中 ti 表示第 i

波奶牛的数量。

输出格式

一个整数,表示被劝离的奶牛的具体数量。

数据范围

前 3

个测试点满足 1≤n≤5。
所有测试点满足 1≤n≤2×105,1≤a,b≤2×105,1≤ti≤2

输入样例1:
4 1 2
1 2 1 1
输出样例1:
0
输入样例2:
4 1 1
1 1 2 1
输出样例2:

2

主要涉及到两个变量a和b,它们分别代表小牛棚和大牛棚的数量。在每次循环中,根据输入的x值(1或2),程序会尝试从相应的牛棚中移除一只牛。

  • 如果x为1,表示需要从小牛棚移除一只牛。此时,如果小牛棚还有剩余,就从小牛棚中移除一只;如果没有小牛棚但有大牛棚,就从大牛棚中移除一只,并将k加1,表示有一个大牛棚的牛被占用了一个小牛棚的空间;如果既没有小牛棚也没有大牛棚,但k大于0,说明有大牛棚的牛被占用了一个小牛棚的空间,此时将k减1;如果既没有小牛棚也没有大牛棚,且k等于0,说明已经没有可以容纳的牛棚了,需要劝返,res加1。

  • 如果x为2,表示需要从大牛棚移除一只牛。此时,如果大牛棚还有剩余,就从大牛棚中移除一只;如果没有大牛棚,就需要劝返,res加2。

最后,输出res的值,表示需要劝返的天数。

#include<bits/stdc++.h>
using namespace std;

int main()
{
    int n, a, b;
    cin >> n >> a >>b;

    int res = 0; // 劝返牛牛数
    int k = 0; // 记录小牛棚没有后,仍然有大牛棚的情况下,大牛棚里为一只牛的数量
    while(n --)
    {
        int x;
        cin >>x;
        if(x == 1)
        {
            if(a > 0) a --; // 还有小牛棚时,a依次减一
            else if(b > 0) b --, k ++; // 没有小牛棚,还有大牛棚的情况
            else if(b == 0 && k > 0) k --; // 没有小牛棚也没有大牛棚,但是大牛棚有一只牛占用一个牛棚的情况
            else if(b == 0 && k == 0) res += 1; //最后啥都没有了,在劝返
        }
        if(x == 2)
        {
            if(b > 0) b --; // 还有大牛棚时,b依次减一
            else res += 2; // 只要没有大牛棚,就得劝返
        }
    }
    cout << res;

    return 0;
}

  • 14
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值