【AcWing】蓝桥杯集训每日一题Day32|贪心|1349.修理牛棚

1349.修理牛棚
1349. 修理牛棚 - AcWing题库
难度:中等
时/空限制:1s / 64MB
总通过数:1275
总尝试数:2405
来源:

usaco training 1.4
算法标签

贪心

题目内容

在一个下着暴风雨的夜晚,大风掀翻了农夫约翰的牛棚的屋顶和大门。
牛棚一个个的并排排成一排,奶牛就住在牛棚中过夜。
由于一些奶牛正在外面度假,牛棚并没有住满,有的牛棚住着牛,有的牛棚空着。
所有的棚子的宽度都相同。
现在,约翰需要订购一批木板用来挡在牛棚的门口。
木材供应商将为他提供任意长度的木板,但是能够提供的木板数量非常有限。
约翰希望他购买的木板的总长度尽可能的小。
现在,给定可以购买的最大木板数量 M,牛棚的总数 S,牛的总数 C,以及 C 个住着牛的牛棚编号。
请你计算确保购买的木板的总长度尽可能小的情况下,为了使所有住着牛的牛棚都用木板挡住门,最少要将多少牛棚的门用木板挡住。

输入格式

第一行包含三个整数 M,S,C。
接下来 C 行,每行包含一个整数,表示一个住着牛的牛棚的编号。

输出格式

输出一个整数,表示被木板挡住门的牛棚的数量。

数据范围

1≤M≤50,
1≤S≤200,
1≤C≤S,
牛棚编号依次为 1∼S。

输入样例:
4 50 18
3
4
6
8
14
15
16
17
21
25
26
27
30
31
40
41
42
43
输出样例:
25
样例解释

一种可行的方案是,用一个木板将 3∼8 号牛棚的门挡住,一个木板将 14∼21 号牛棚的门挡住,一个木板将 25∼31 号牛棚的门挡住,一个木板将 40∼43 号牛棚的门挡住,这样一共遮挡了 25 个牛棚的门。

题目解析

牛棚排成一排
有的牛棚住着牛,有的牛棚没有住着牛
牛棚的宽度都相同
木板的长度可以任意,木板的数量是有限的
希望订购木板的总长度最小

挡住所有有牛的牛棚,总木板数量不超过M的情况下,要购买的木板的总长度是多少

用1表示有牛,0表示没有牛
110100111,M=2
第一个木板挡前四个,第二个木板挡后三个,这样长度为7
第一个木板挡前二个,第二个木板挡后六个,这样长度为8
不同的方案,木板的长度是不一样的
希望找到一个总长度最小的方案

数据范围很小

用哪些线段把所有的1覆盖住
不如倒着想
从第一头牛到最后一头牛,先用一块板子都覆盖住
然后再挖空
把中间连续的0挖掉,这样最终也可以形成一些线段

先考虑一下这两种方案是不是等价的

显然等价
任意给一个正着做的方案,倒着做仍然可以得到
先一整个都覆盖住,再把中间的空挖掉,长度一样

对于任何一个倒着做的方案,先覆盖住,然后挖掉
正着做仍然可以得到,一个一个覆盖就可以了,长度也一样

求原题的最小值相当于求倒着做的最小值


中间有一些连续的0
挖空的时候,如果挖掉了连续0里面的某些0,在最优解中一定会把区间里面连续的0都挖掉
连续的0要么都不挖,要么都挖

先把其中连续的0都找出来
每一段都可以选择挖
倒着做的话,一开始只有一个区间,最多是有M个区间,每挖掉一段都会多一个区间,因此最多只能挖M-1个区间

一开始一整段长度是固定的,为了让剩下的总长度最小,应该让挖掉的总长度最大

先把所有可以挖的区间找出来
把长度丢到一个集合当中,在其中最多选择M-1个数,是的总和最大
按照从大到小排个序,取前M-1个最大的数,就可以了

经典贪心问题

先求一下第一个1到最后一个1的总长度
再把其中所有连续0的长度拿出来,扔到一个集合里
从大到小排序,取前最大的M-1个数,算一下总和,从总长度中减去,就是答案

代码
#include <iostream>
#include <cstring>
#include <algorithm>using namespace std;const int N = 210;int m, s, c;
int a[N], b[N];
//a表示初始牛所在的牛棚的编号,b表示每一段0的长度int main()
{cin >> m >> s >> c;//读入所有牛的编号for (int i = 0; i < c; i ++) cin >> a[i];//先把牛的编号从小到大排个序sort(a, a + c);//计算一下从第一个1到最后一个1的长度int res = a[c - 1] - a[0] + 1;//再找到所有连续的0for (int i = 0; i + 1 < c; i ++)//连续的0的数量是下一个1的位置减去当前1的位置再减去1b[i] = a[i + 1] - a[i] - 1;//可以把两个1之间的0的数量找出来,包含0个0的区间sort(b, b + c - 1, greater<int>());//选择最大的m-1个数for (int i = 0; i < m - 1 && i < c - 1; i ++)res -= b[i];cout << res << endl;return 0;
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/811394.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

鸿蒙TypeScript学习第13天:【元组】

1、TypeScript 元组 我们知道数组中元素的数据类型都一般是相同的&#xff08;any[] 类型的数组可以不同&#xff09;&#xff0c;如果存储的元素数据类型不同&#xff0c;则需要使用元组。参考文档&#xff1a;qr23.cn/AKFP8k 元组中允许存储不同类型的元素&#xff0c;元组…

代码随想录算法训练营day36

435_无重叠区间 题目&#xff1a; 给定一个区间的集合 intervals &#xff0c;其中 intervals[i] [starti, endi] 。返回 需要移除区间的最小数量&#xff0c;使剩余区间互不重叠 。 示例 1: 输入: intervals [[1,2],[2,3],[3,4],[1,3]] 输出: 1 解释: 移除 [1,3] 后&…

手把手教你创建新的OpenHarmony 三方库

创建新的三方库 创建 OpenHarmony 三方库&#xff0c;建议使用 Deveco Studio&#xff0c;并添加 ohpm 工具的环境变量到 PATH 环境变量。 创建方法 1&#xff1a;IDE 界面创建 在现有应用工程中&#xff0c;新创建 Module&#xff0c;选择"Static Library"模板&a…

bash脚本中‘-b -u -p’‘$# -eq’‘#!/bin/bash’‘sed -i “s/\r//“ $1’的用法说明

#!/bin/bash#!/bin/bash: 这是 Bash 脚本的开头&#xff0c;指定了要使用的解释器&#xff0c;即 Bash。 if [ $# -eq 0 ]; thenif [ $# -eq 0 ]; then: 检查脚本是否被调用时提供了参数。$# 表示参数的数量&#xff0c;-eq 0 表示等于 0&#xff0c;即无参数。 echo "p…

2024-3-29 群讨论:如何看到一个线程的所有 JFR 事件

以下来自本人拉的一个关于 Java 技术的讨论群。关注公众号&#xff1a;hashcon&#xff0c;私信拉你 如何查看一个线程所有相关的 JFR 事件 一般接口响应慢&#xff0c;通过日志可以知道是哪个线程&#xff0c;但是如何查看这个线程的所有相关的 JFR 事件呢&#xff1f;JMC 有…

五种主流数据库:子查询

SQL 支持查询语句的嵌套&#xff0c;也就是在一个语句中包含其他的查询语句。嵌套子查询可以用于实现灵活复杂的查询语句。 本文比较五种主流数据库实现的子查询功能&#xff0c;包括 MySQL、Oracle、SQL Server、PostgreSQL 以及 SQLite。 功能MySQLOracleSQL ServerPostgre…

探索网络爬虫:技术演进与学习之路

网络爬虫及IP代理池 前言爬虫技术的演进最新的爬虫技术爬虫技术学习路线 前言 在信息时代&#xff0c;网络爬虫技术作为获取和处理网络数据的重要手段&#xff0c;已经成为数据科学、机器学习和许多商业应用的基石。从简单的HTML页面抓取到复杂的动态内容采集&#xff0c;爬虫…

【Java】如果把线程同步机制比喻成餐厅经理

要更好理解Java的线程同步机制&#xff0c;可以尝试通过餐厅经营的方式来进行类比。厨师&#xff08;共享资源&#xff09;在厨房里忙碌着&#xff0c;而顾客&#xff08;线程&#xff09;都在点菜和等待他们的食物。在这个场景中&#xff0c;同步机制就像是餐厅的经理&#xf…

三大能力升级!大模型开启智能客服新篇章

当前智能化已成为各行各业加速转型发展的关键词&#xff0c;客户服务领域也不例外&#xff0c;将大语言模型与文档问答结合&#xff0c;不仅能够有效提升知识构建效率&#xff0c;重塑智能客服模式&#xff0c;还将成为企业营销、运营智能化进程中的重要助推力&#xff01; 接…

Redis从入门到精通(十四)Redis分布式缓存(二)Redis哨兵集群的搭建和原理分析

文章目录 前言5.3 Redis哨兵5.3.1 哨兵原理5.3.1.1 集群的结构和作用5.3.1.2 集群监控原理5.3.1.3 集群故障恢复原理 5.3.2 搭建哨兵集群5.3.3 RedisTemplate5.3.3.1 搭建测试项目5.3.3.2 场景测试 前言 Redis分布式缓存系列文章&#xff1a; Redis从入门到精通(十三)Redis分…

一个开源嵌入式USB设备协议栈:FelisUSB

概述 Felis USB 是一个嵌入式USB协议栈。它不依赖于软件系统支持&#xff0c;可以轻量级迁移使用。 Felis USB is an USB stack for embedded system. See introduction in English here. 源码链接&#xff1a;season-studio/FelisUSB:null_C - GitCode开源社区 为什么开发Feli…

AI时代的新星:Devin AI 工程师的崛起

近日&#xff0c;人工智能领域掀起了一股新浪潮&#xff0c;一家成立不到两个月的初创公司Cognition推出了一款名为Devin的全球首位AI工程师。这款AI工程师引起了业界的高度关注&#xff0c;其独特的特点和能力使其成为软件开发领域的一颗耀眼之星。 Devin并非仅仅是一款编写代…

欧盟网络安全局:公共数据空间中的个人数据保护设计(下)

三、应用场景分析:健康—医药用途 2020年欧盟发布欧盟医药战略,旨在应对制药行业面临的各种机遇和挑战,以确保欧盟公民对于药品的可获得性、可负担性和可持续性。[4]报告将药品数据空间作为一种可能的手段,旨在支持数据使用者对于药品市场供应情况和药品功效的研究和分析。…

Java复习第十七天学习笔记(转发、重定向,GET,POST),附有道云笔记链接

【有道云笔记】十七 4.3 转发、重定向、Get、POST、乱码 https://note.youdao.com/s/GD5TRksQ 一、转发 转发&#xff1a;一般查询了数据之后&#xff0c;转发到一个jsp页面进行展示 req.setAttribute("list", list); req.getRequestDispatcher("student_lis…

大厂面试:获取字符串的全排列

一、概念 现有一个字符串&#xff0c;要打印出该字符串中字符的全排列。例如输入字符串abc&#xff0c;则打印出由字符a、b、c所能排列出来的所有字符串abc、acb、bac、bca、cab和cba。 可以基于回溯法来解决这个问题。 二、代码 public class Permutation {//输出字符串str的全…

算法 第38天 动态规划1

509 斐波那契数 斐波那契数 &#xff08;通常用 F(n) 表示&#xff09;形成的序列称为 斐波那契数列 。该数列由 0 和 1 开始&#xff0c;后面的每一项数字都是前面两项数字的和。也就是&#xff1a; F(0) 0&#xff0c;F(1) 1 F(n) F(n - 1) F(n - 2)&#xff0c;其中 n…

权限修饰符,代码块,抽象类,接口.Java

1&#xff0c;权限修饰符 权限修饰符&#xff1a;用来控制一个成员能够被访问的范围可以修饰成员变量&#xff0c;方法&#xff0c;构造方法&#xff0c;内部类 &#x1f47b;&#x1f457;&#x1f451;权限修饰符的分类 &#x1f9e3;四种作用范围由小到大(private<空着…

SV-704XT 100W网络有源音柱 校园广播音柱

SV-704XT 100W网络有源音柱 一、描述 SV-704XT是深圳锐科达电子有限公司的一款壁挂式网络有源音柱&#xff0c;具有10/100M以太网接口&#xff0c;可将网络音源通过自带的功放和喇叭输出播放&#xff0c;其采用防水设计&#xff0c;功率100W。SV-704XT作为网络广播播放系统的终…

【算法】斐波那契数列第n位 - 去重递归/双指针迭代

题目 给定n&#xff0c;求斐波那契数列第n位的数值。 斐波那契数列&#xff1a;0 1 1 2 3 5 8 13 …… 每个数等于前面两个数相加&#xff0c;第n位等于第(n - 1)位加上第(n - 2)位。 原理 去重递归 使用递归的方式计算出结果&#xff0c;但使用一个数组保存已经计算出来的值…

java 将 json 数据转为 java 中的对象

一、准备 json 数据 {"name": "mike","age": 17,"gender": 1,"subject": ["math","english"] }二、对应的java对象 package com.demo.controller;import lombok.Data; import java.util.List;Data pu…