当前位置: 首页 > article >正文

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 <iostream>
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 <iostream>
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;
}


http://www.kler.cn/a/108289.html

相关文章:

  • Word表格另起一页解决办法
  • 如何使用Porcupine做一个安卓端语音唤醒demo
  • HarmonyOS Next 实现登录注册页面(ARKTS) 并使用Springboot作为后端提供接口
  • Git如何添加子仓库
  • “校园疫情防控的技术支持”:疫情管控系统的实现与评估
  • uniapp实现为微信小程序扫一扫的功能
  • 应用案例|基于三维机器视觉的机器人引导电动汽车充电头自动插拔应用方案
  • 怎么降低Linux内核驱动开发的风险?
  • 粤嵌实训医疗项目--day03(Vue + SpringBoot)
  • c# .net6 在线条码打印基于
  • 云服务器搭建Spark集群
  • centos服务器搭建安装Gitlab教程使用教程
  • 电子器件 电感
  • 设计模式面试知识点总结
  • Node编写重置用户密码接口
  • 大数据-Storm流式框架(六)---Kafka介绍
  • npm : 无法加载文件 C:\Program Files\nodejs\npm.ps1,因为在此系统上禁止运行脚本。
  • MySQL的安装和配置
  • 【2021集创赛】Robei杯一等奖:基于Robei EDA工具的隔离病房看护机器人设计
  • 在自己的服务器上部署个人博客和开源项目:实现数字存在感
  • 基于单片机设计的防煤气泄漏装置
  • 阿里云核心产品list
  • kubectl资源管理命令-陈述式
  • 深度学习使用Keras进行多分类
  • docker的安装部署nginx和mysql
  • Vue图片路径问题(动态引入)