acwing 5283. 牛棚入住

题目 - 点击直达

  • 1. 5283. 牛棚入住
    • 1. 题目详情
      • 1. 原题链接
      • 2. 题目要求
      • 3. 基础框架
    • 2. 解题思路
      • 1. 思路分析
      • 2. 时间复杂度
      • 3. 代码实现

1. 5283. 牛棚入住

1. 题目详情

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

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

已知,今天一共有 n 波奶牛依次前来入住,每波由 1∼2 头奶牛组成。

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

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

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

  • 如果有空着的大牛栏,则安排它们在空着的大牛栏入住。
  • 如果没有空着的大牛栏,则将它们劝离。
  • 请你计算,一共有多少头奶牛会被劝离。

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

1. 原题链接

acwing 5283. 牛棚入住

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

3. 基础框架

● Cpp代码框架

#include 
using namespace std;
int main(){
	return 0;
}

2. 解题思路

1. 思路分析

( 1 ) (1) (1) 小牛栏共有 a a a个,每个最多有 1 1 1头牛,小牛栏最多放 a a a头牛;
小牛栏有 2 2 2种状态:0头牛和1头牛,用一个变量 a 1 a1 a1表示小牛栏空闲的数量;
( 2 ) (2) (2) 大牛栏共有 b b b个,每个最多有 2 2 2头牛,大牛栏最多放 2 ∗ b 2*b 2b头牛;
大牛栏有 3 3 3种状态:0头牛、1头牛、2头牛,用变量b1表示大牛栏中空闲 1 1 1个栏位的数量, b 2 b2 b2表示空闲 2 2 2个栏位的数量;
( 3 ) (3) (3) 对于每一波来的牛,可能是 1 1 1头,也可能是 2 2 2头;
用变量 c n t cnt cnt记录劝离的牛数量;
用变量 f f f记录当前在等待入栏的牛的数量;
( 4 ) (4) (4) 来1头牛时:
判断 a 1 a1 a1,若 a 1 a1 a1不为0则表示小牛栏还有空位,不劝离,设置 f = 0 f=0 f=0;
判断 b 2 b2 b2,若 b 2 b2 b2不为0且 f = = 1 f==1 f==1则表示大牛栏有空位且该牛还在等待,不劝离,设置 f = 0 f=0 f=0 b 2 b2 b2自减1, b 1 b1 b1自增1;
判断 b 1 b1 b1,若 b 1 b1 b1不为0且 f = = 1 f==1 f==1则表示大牛栏有一个空位且该牛还在等待,不劝离,设置 f = 0 f=0 f=0 b 1 b1 b1自减1;
( 5 ) (5) (5) 来2头牛时:
判断 b 2 b2 b2,若 b 2 b2 b2不为0则表示大牛栏有空位,不劝离,设置 f = 0 f=0 f=0 b 2 b2 b2自减1;
( 6 ) (6) (6) f f f不为0说明此时本波到来的牛被劝离, c n t cnt cnt加上 f f f就是止至到本波被劝离的牛的数量;

2. 时间复杂度

O ( N ) O(N) O(N)
每波需要对到来的牛判断,共有n波,每波内的判断是常数次;

3. 代码实现

#include 
using namespace std;

int main(){
	// 输入处理
    int n,a,b;
    cin >> n >> a >> b;
    int arr[n];
    for(int i = 0; i < n; ++i){
        int tmp;
        cin >> tmp;
        arr[i] = tmp;
    }
    // 逻辑处理
    int a1 = a;
    int b1 = 0;
    int b2 = b;
    int cnt = 0;
    for(int i = 0; i < n; ++i){
        if(arr[i] == 1){
            if(a1 != 0){
                a1--;
                arr[i] = 0;
            }
            
            if(b2 != 0 && arr[i] == 1){
                b2--;
                b1++;
                arr[i] = 0;
            }
            
            if(b1 != 0 && arr[i] == 1){
                b1--;
                arr[i] = 0;
            }
            
        }
        else{
            if(b2 != 0){
                b2--;
                arr[i] = 0;
            }
        }
        cnt += arr[i];
    }
    // 输出
    cout << cnt << endl;
    return 0;
}

你可能感兴趣的:(LeetCode刷题,算法)