• acwing 5283. 牛棚入住


    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;
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5

    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;
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47
    • 48
    • 49

  • 相关阅读:
    【广州华锐互动】利用VR开展细胞基础实验教学有什么好处?
    欢度盛夏,畅享清凉——七月超市营销策略
    Python操作Redis从入门到精通附代码(全)
    分享66个Python管理系统源代码总有一个是你想要的
    分布式事务保姆级教程
    深析C语言的灵魂 -- 指针
    JVM-堆中线程私有空间TLAB(Thread Local Allocation Buffer)
    《永远的爱犬》The forever dog英文版
    【论文笔记】Federated Learning for Wireless Communications: Motivation, Opportunities, and Challenges(综述)
    python模块之redisbloom redis布隆过滤器
  • 原文地址:https://blog.csdn.net/weixin_64904163/article/details/134095938