贝茜经营的牛棚旅店中有 a 个可供一头牛入住的小牛栏和 b
个可供两头牛入住的大牛栏。
初始时,所有牛栏都是空的。
已知,今天一共有 n
波奶牛依次前来入住,每波由 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;
}