P9011 [USACO23JAN] Air Cownditioning II B

OJ错题合集 阅读详情

记录138

#include<bits/stdc++.h> 
using namespace std; 
const int N=110; // 定义常量N,表示牛栏的最大范围(题目保证<=100)
int n,m; // n表示奶牛数量,m表示空调数量
int s[N],t[N],c[N]; // 记录每头奶牛的左边界s、右边界t和降温需求c
int a[N],b[N],p[N],cost[N]; // 记录每台空调的左边界a、右边界b、降温能力p和花费cost
int cur[N]; // 模拟数组,记录当前选中的空调对每个牛栏的总降温量
int ans=1e9; // 定义全局变量ans,记录满足条件的最少花费,初始化为一个极大值

// 检查当前选中的空调方案是否满足所有奶牛的降温需求
bool check(){
    for(int i=1;i<=n;i++){ // 遍历每一头奶牛
        // 检查该奶牛占据的每一个牛栏是否都达到了降温需求c[i]
        for(int j=s[i];j<=t[i];j++){
            if(cur[j]<c[i]){ // 如果某个牛栏的降温量不足
                return false; // 当前方案不合法,返回false
            }
        }
    }
    return true; // 所有奶牛的需求都满足,返回true
}

// 深度优先搜索(DFS)函数,step表示当前正在决策第几台空调,sum表示当前已花费的金钱
void dfs(int step,int sum){
    if(step>m){ // 如果已经决策完了所有的m台空调
        if(check()) ans=min(ans,sum); // // 当前方案如果合法,更新全局最小花费      
        return; // 结束当前递归分支
    } 
    // 选择1:不选第deep台空调,直接决策下一台,花费不变
    dfs(step+1,sum);
    // 选择2:选第step台空调
    for(int i=a[step];i<=b[step];i++){ // 将该空调的降温效果累加到模拟数组中
        cur[i]+=p[step];
    }
    dfs(step+1,sum+cost[step]); // 决策下一台空调,花费加上当前空调的费用
    // 回溯:撤销选择第step台空调的影响(将降温效果减回去),以免影响其他分支
    for(int i=a[step];i<=b[step];i++){
        cur[i]-=p[step];
    }
}

int main(){ // 主函数入口
    ios::sync_with_stdio(false); // 关闭标准流同步,提升输入输出效率
    cin.tie(0); // 解除cin与cout的绑定,加快读取速度
    cin>>n>>m; // 读入奶牛数量n和空调数量m
    for(int i=1;i<=n;i++){ // 循环读入每头奶牛的信息
        cin>>s[i]>>t[i]>>c[i]; // 读入左边界、右边界和降温需求
    }
    for(int i=1;i<=m;i++){ // 循环读入每台空调的信息
        cin>>a[i]>>b[i]>>p[i]>>cost[i]; // 读入左边界、右边界、降温能力和花费
    }
    
    dfs(1,0); // 从第1台空调开始搜索,初始花费为0
    cout<<ans<<"\n"; // 输出满足所有奶牛需求的最少花费
    return 0; // 程序正常结束
}

题目传送门https://www.luogu.com.cn/problem/P9011


前言

我是一名专注信奥赛(CSP-J/S、NOIP)的教练。

  • 如果你觉得这篇题解对你有帮助,欢迎点击关注我的优快云账号,我会持续更新高质量算法解析。
  • 我深知算法思维的构建远比单纯通过题目更重要,本系列题解不局限于AC代码的堆砌,而是致力于拆解题目背后的逻辑链条与核心知识点
  • 备赛路上若遇瓶颈,欢迎随时评论或私信,我将甄选典型疑难问题,通过视频讲解或撰写专项文章的形式,为你提供深度答疑。

 核心解题思路

这道题是一道非常经典的状态空间搜索(子集枚举)问题。

  1. 数据规模分析:
    题目中奶牛数量 N≤20 ,牛栏编号范围 ≤100 ,而最关键的是空调数量M≤10 。由于 MM 非常小,我们可以直接枚举所有空调的选取状态。

  2. 算法选择(DFS + 回溯):
    对于每一台空调,我们只有两种选择:“购买”或“不购买”。因此,总共有 2M 种可能的组合方案。我们可以使用深度优先搜索(DFS)来遍历这棵决策树。

    • 在搜索过程中,我们需要一个数组 cur[] 来实时记录当前选中的空调组合下,每个牛栏被降低的温度。
    • 当所有空调都决策完毕后,我们检查 cur[] 数组是否满足所有奶牛的降温需求。如果满足,则更新全局最小花费。
    • 为了不影响其他分支的搜索,在选择某台空调并递归后,必须将其降温效果从 cur[] 中减去(即回溯操作)。

 代码分块详细解释

1. 头文件、常量与全局变量定义

#include<bits/stdc++.h> 
using namespace std; 
const int N=110; // 定义常量 N,表示牛栏的最大范围(题目保证<=100)
int n,m; // n表示奶牛数量,m表示空调数量
int s[N],t[N],c[N]; // 记录每头奶牛的左边界s、右边界t和降温需求c
int a[N],b[N],p[N],cost[N]; // 记录每台空调的左边界a、右边界b、降温能力p和花费cost
int cur[N]; // 模拟数组,记录当前选中的空调对每个牛栏的总降温量
int ans=1e9; // 定义全局变量 ans,记录满足条件的最少花费,初始化为一个极大值
  • 详细分析:这部分定义了算法所需的全局状态。cur[N] 数组是本题的核心,它充当了一个“虚拟温度计”,用来动态模拟当前决策下各个牛栏的降温情况。ans 初始化为 1e9(一个比最大可能花费大得多的数),作为打擂法求最小值的初始基准。

2. 合法性检查函数(check)

// 检查当前选中的空调方案是否满足所有奶牛的降温需求
bool check(){
    for(int i=1;i<=n;i++){ // 遍历每一头奶牛
        // 检查该奶牛占据的每一个牛栏是否都达到了降温需求 c[i]
        for(int j=s[i];j<=t[i];j++){
            if(cur[j]<c[i]){ // 如果某个牛栏的降温量不足
                return false; // 当前方案不合法,返回 false
            }
        }
    }
    return true; // 所有奶牛的需求都满足,返回 true
}
  • 详细分析:这个函数用于在搜索到达叶子节点(即所有空调都决策完毕)时,判断当前方案是否可行。它遍历每一头奶牛所在的区间 [si,ti][si​,ti​] ,逐一比对 cur 数组中的实际降温量是否大于等于需求 cici​ 。只要有一个牛栏不达标,整个方案就作废。

3. 核心逻辑:DFS 与回溯

// 深度优先搜索(DFS)函数,step 表示当前正在决策第几台空调,sum 表示当前已花费的金钱
void dfs(int step, int sum){
    if(step>m){ // 如果已经决策完了所有的 m 台空调
        if(check()) ans=min(ans,sum); // 当前方案如果合法,更新全局最小花费      
        return; // 结束当前递归分支
    } 
    // 选择 1:不选第 step 台空调,直接决策下一台,花费不变
    dfs(step+1, sum);
    
    // 选择 2:选第 step 台空调
    for(int i=a[step];i<=b[step];i++){ // 将该空调的降温效果累加到模拟数组中
        cur[i]+=p[step];
    }
    dfs(step+1, sum+cost[step]); // 决策下一台空调,花费加上当前空调的费用
    
    // 回溯:撤销选择第 step 台空调的影响(将降温效果减回去),以免影响其他分支
    for(int i=a[step];i<=b[step];i++){
        cur[i]-=p[step];
    }
}
  • 详细分析:这是代码的灵魂,完美体现了回溯算法的“选择 -> 递归 -> 撤销选择”三步走策略。
    • 递归终止条件:当 step > m 时,说明 MM 台空调已经全部决策完毕,此时调用 check() 函数进行合法性验证,如果合法则更新全局最优解 ans。
    • 分支 1(不买):直接递归进入下一台空调的决策,当前花费 sum 和 cur 数组均保持不变。
    • 分支 2(购买):首先通过循环将第 step 台空调的降温能力 p[step] 累加到其覆盖区间 [astep,bstep]的 cur 数组中;然后带着增加的花费 sum + cost[step] 递归进入下一层。
    • 回溯操作:当“购买”这个分支递归返回后,为了不影响后续“不买”分支或其他组合的计算,必须将刚才加上的降温效果原封不动地减回去。

4. 主函数:输入处理与启动搜索

int main(){ 
    ios::sync_with_stdio(false); 
    cin.tie(0); 
    cin>>n>>m; // 读入奶牛数量 n 和空调数量 m
    for(int i=1;i<=n;i++){ // 循环读入每头奶牛的信息
        cin>>s[i]>>t[i]>>c[i]; // 读入左边界、右边界和降温需求
    }
    for(int i=1;i<=m;i++){ // 循环读入每台空调的信息
        cin>>a[i]>>b[i]>>p[i]>>cost[i]; // 读入左边界、右边界、降温能力和花费
    }
    
    dfs(1,0); // 从第 1 台空调开始搜索,初始花费为 0
    cout<<ans<<"\n"; // 输出满足所有奶牛需求的最少花费
    return 0; 
}
  • 详细分析:主函数负责数据的读入和算法的启动。由于 M 最大为 10,搜索树的节点总数为 2^10=1024 ,加上每次 check 的复杂度为 O(N×100) ,整体计算量极小,可以在瞬间得出结果。

核心逻辑总结表

代码模块核心变量/操作精炼作用解决的痛点
模拟数组int cur[N]动态记录当前方案下各牛栏的降温量将抽象的空调覆盖重叠问题,转化为直观的数组累加操作
合法性检查check() 函数验证当前方案是否满足所有奶牛需求在搜索树的叶子节点进行“剪枝”或“记录答案”的判定
状态累加cur[i] += p[step]模拟购买空调后的降温效果在 DFS 向下递归时,正确传递当前决策带来的状态改变
回溯操作cur[i] -= p[step]撤销购买空调带来的状态改变保证 DFS 的不同分支之间互不干扰,是回溯算法的核心
子集枚举双重 dfs 递归遍历所有空调的购买组合利用 M≤10M≤10 的小规模,用暴力搜索替代复杂的贪心或 DP
Kaggle时间序列竞赛金牌方案解析与实战指南 本文深度解析了Kaggle时间序列竞赛的金牌方案,揭示了其成功不仅依赖先进模型,更在于系统工程思维。文章系统阐述了从数据理解、特征工程到模型集成与后处理的全流程,并重点剖析了分层建模、自定义损失函数、时序交叉验证等核心技巧,为参赛者提供了从理论到实战的完整指南。 阅读详情

相关推荐

突破Shopee平台数据采集的风控挑战与技术解决方案

高效、稳定、合规的数据采集能力,始终是我们服务的核心价值。多类型代理组合:采用高匿名住宅代理(模拟真实用户IP)与数据中心代理(高并发需求)混合策略,结合IP轮换频率与目标国家后缀(如.com.my、.vn)动态匹配14。反反爬数据过滤:针对Shopee页面中的混淆数据(如虚假价格标签、隐藏元素),采用XPath精准定位结合正则表达式清洗,确保数据准确性89。随机化请求间隔:在爬虫代码中引入随机延迟(如1-5秒),并模拟“浏览-点击-滚动”等用户行为链,降低行为模式的可预测性48。

klj3388的博客 2982

每日一题(dfs) 洛谷 P9011 [USACO23JAN] Air Cownditioning II B

然后遇到一个空调就在空调范围内数组cw都减p,同时加上空调的费用。我们可以用一个桶cw(其实就是一个数组)来表示需要下降的温度和。最后检查cw的数据情况就行了。dfs 深度优先搜索。利用dfs一步一步看。

lddya的博客 914

CCS20实战入门:第一个工程搭建示例

通过实际操作演示如何在ccs20中创建并配置首个开发项目,涵盖环境设置与基础调试步骤,帮助新手快速上手ccs20集成开发环境,提升嵌入式开发效率。

weixin_31185473的博客 888

P9011 [USACO23JAN] Air Cownditioning II B提交答案加入题单复制题目

第 i 台空调需要花费 mi​ 单位的金钱来运行 (1≤mi​≤1000) ,如果运行,第 i 台空调将牛栏 [ai​,bi​] 所有牛栏的温度降低 pi​(1≤pi​≤106)。对于 100% 的数据,1≤N≤20, 1≤M≤10, 1≤ai​,bi​,si​,ti​≤100, 1≤ci​,pi​≤106, 1≤mi​≤1000。一种花费最少的可能解决方案是选择那些冷却区间为 [2,9] 、[1,2] 和 [6,9] 的空调,成本为 3+2+5=10 .

2403_88223186的博客 746

【win11+vs 2017+OpenCV4.5.5+Qt5.12配置】详细安装过程+小问题解决

由于Qt5无法与最新的vs2022兼容,扩展工具中一直显示不可用,所以将vs降级成vs2017。在安装Qt的过程中,会选择安装Qt套件,其中就的MCVS 2017,说明vs2017是与qt兼容的。当然也可以用qt creator这一原生IDE。OpenCV版本目前是最新的4.8.0,使用过程中没有什么问题,但是还是安装低版本大概率避免一些玄学问题。

qq_45306739的博客 3351

加法器设计—— 原理图与VHDL设计初步

1、在DE2-115开发板上,完成4位全加器系统的设计、下载和功能演示,并在FPGA上实现1位全加器;2、完成3-8译码器的设计、下载和功能演示(利用板上的8段数码管)本次实验在组合逻辑电路的基础上,运用Verilog编程实现了四位全加器和3-8译码器的设计,同时实现了在DE2-115开发板上的下载和功能演示。整个过程加深了我对电路设计和Verilog编程的理解,同时也锻炼了解决问题的能力。

m0_74749526的博客 1239

P9011 [USACO23JAN] Air Cownditioning II B(dfs+差分)

谷仓包含 M 台空调,标记为 1−M (1≤M≤10)。第 i 台空调需要花费 mi​ 单位的金钱来运行 (1≤mi​≤1000) ,如果运行,第 i 台空调将牛栏 [ai​,bi​] 所有牛栏的温度降低 pi​(1≤pi​≤106)。对于 100%100% 的数据,1≤N≤20, 1≤M≤10, 1≤ai​,bi​,si​,ti​≤100, 1≤ci​,pi​≤106,1≤mi​≤1000。第 (N+2) 至 (M+N+1) 行,每行四个整数, 分别为 ai​、bi​、pi​ 和 mi​。

m0_74083096的博客 2751

基于java实现的弹幕视频网站

开发语言:Java框架:ssm技术:JSPJDK版本:JDK1.8服务器:tomcat7数据库:mysql 5.7(一定要5.7版本)数据库工具:Navicat11开发软件:eclipse/myeclipse/ideaMaven包:Maven3.3.9系统展示弹幕视频网站,在弹幕视频网站可以查看首页、视频信息、商品信息、论坛信息、我的、跳转到后台、购物车、客服等内容前台首页界面图登录,通过登录填写账号、密码等信息进行登录操作登录界面图视频信息界面图。

DC5621的博客 1333

P9011 [USACO23JAN] Air Cownditioning II B(纪念自己独立完成的第一个DFS题)

传进dfs后首先设置边界ki>M,因为是从第一台空调开始遍历,当ki大于M的时候代表已经把全部的空调都已经搜索过了,就用dp函数判断选了ans个空调之后能不能达到牛棚要求的温度,并且计算ans个空调要花费多少钱sum,如果达到牛棚要求的温度,就比较sum和temp(temp就跟打擂台一样,先给它赋值一个很大的数,然后与每次与sum进行比较,如果sum<temp就更新temp的值)我感觉我写的代码思路还是挺简单的,挺直白的,应该挺适合初学者来看的吧。首先创建了两个结构体,存储空调的数据和牛的数据。

li050103的博客 431

【Unity】Pico VR 开发实战:从环境搭建到交互实现

本文是一份详细的Unity Pico VR开发实战指南,涵盖从环境搭建到核心交互实现的全流程。详细讲解了如何集成Pico Unity Integration SDK与XR Interaction Toolkit,配置开发环境,并重点解析了手柄输入处理、射线交互以及VR UI操作三大核心模块的代码实现与优化技巧,帮助开发者快速上手Pico VR应用开发。

rice5的博客 1177

Cadence IC5141保姆级教程:Bandgap电路四大仿真(稳定性/噪声/启动/PSRR)完整流程与调参心得

本文提供Cadence IC5141中Bandgap电路的四大仿真(稳定性仿真、噪声仿真、启动仿真、PSRR仿真)的完整流程与调参心得。从原理图检查到ADE L配置,详细解析各仿真步骤的关键参数设置与优化策略,帮助工程师高效完成电路设计与性能调优。

weixin_30399821的博客 1654

P9011 [USACO23JAN] Air Cownditioning II B(差分优化+dfs)

我们枚举,每个空调都有选和不选两种情况,挺简单的没啥好讲滴~(代码见注释宝子)思路:看到N

m0_74969835的博客 533

RK3588 , 基于mpp 解码 Jpeg To RGB

本文介绍了在RK3588开发板上使用Rockchip MPP(Media Process Platform)硬件加速接口将JPEG图像解码为RGB格式的完整流程。主要包括三个关键步骤:1) 读取JPEG文件数据;2) 配置MPP解码器,包括初始化上下文、设置RGB888输出格式和解码参数;3) 执行解码任务并将结果保存为图像文件。通过硬件加速,该方法能高效完成JPEG到RGB的转换,适用于嵌入式多媒体处理场景。

J。 1212

打卡信奥刷题(722)用C++信奥P9011[普及组/提高] [USACO23JAN] Air Cownditioning II B

农夫约翰的N头奶牛1≤N≤20住在一个谷仓里,谷仓里有连续的牛栏,编号为1−100。奶牛i占据了编号si​ti​的牛栏。不同奶牛占据的牛栏范围是互不相交的。奶牛有不同的冷却要求,奶牛i占用的每个牛栏的温度必须至少降低ci​单位。谷仓包含M台空调,标记为1−M1≤M≤10。第i台空调需要花费mi​单位的金钱来运行1≤mi​≤1000,如果运行,第i台空调将牛栏ai​bi​所有牛栏的温度降低pi​1≤p。

Loge谈信奥--一个专注于信奥人的博客 4534

pscad IEEE标准系统搭建说明

pscad IEEE标准系统搭建说明,包含典型的IEEE 9节点、14节点、30节点、39节点和118节点系统。内含标准测试系统的原始数据和潮流结果。

锂电池充电器电路设计 里面有电路

锂电池充电器电路设计 里面有电路 3.7V升压到5V电路设计。

P9011 Air Cownditioning题解复盘

【代码】P9011 Air Cownditioning题解复盘。

2604_96548757的博客 355

LinePhone3.2.7(android端最新版本) sip客户端

SIP客户端For android:LinePhone3.2.7(最新版本),官网地址:http://www.linphone.org/

USACO历年青铜组真题解析 | 汇总

我把自己练习过的USACO的题目都整理了一下。虽然网站上有许多高手的解法,但因为我自己也是初学者,所以只用了比较容易理解的方法来分析和解答。如果你也在学习的话,希望这些内容能对你有一点帮助。

团爸讲算法 5671

OV9734 DATASHEET,完整规格书

OV9734完整规格书,包括电气参数,尺寸规格,寄存器配置表等

USACO青铜组真题解析:从模拟枚举到三值排序

在算法竞赛入门阶段,模拟、枚举、计数与贪心是最核心的基础能力,它们共同构成了解决约束型问题的底层思维框架。理解这些算法的关键在于把握数据范围对解法的制约:大数据量需要批量处理或公式推导,小数据量则可以直接暴力枚举或DFS搜索。掌握这些原理后,面对区间覆盖、状态计数、排序优化等实际工程场景,就能快速识别题目的暗示并选择正确策略。USACO青铜组正是检验这些基础能力的典型赛场,以2023年1月真题为例,四道题分别覆盖批量模拟、子集枚举、约束计数以及最小交换次数推导,其中三值排序更是将贪心与计数融合为精炼公式,适

weixin_33483304的博客 238

USACO 12月 2021-2022 December Contest Bronze 题解

USACO 2021-2022 赛期 12月 青铜题解

EN- 3572

视频隐私脱敏工程化:CSRT/KCF追踪算法在本地推理中的实现与边界

在短视频内容合规审查中,动态遮挡(Dynamic Masking)是高频且高耗时的环节。传统手动关键帧打码不仅效率低下,且在目标快速移动或遮挡时极易出现遮罩漂移。本文从计算机视觉工程角度,解析基于CSRT与KCF算法的目标追踪方案在视频隐私处理中的技术路径、性能权衡及落地实践。

Mysssone的博客 296

把 KV Cache 压到 FP4:BitDecoding-FP4 的算法-系统协同设计复盘

长上下文推理卡在KV Cache的显存与带宽上,而现有FP4方案要么精度崩、要么速度废。这篇文章复盘BitDecoding-FP4如何用三个算法补丁加一个系统重构,在B300上把服务吞吐提升2.4–3.0倍,精度几乎不掉。

helloagent的博客 308

【算法拾光】链表 哈希表|K个一组翻转链表 + 两数之和

K个一组翻转链表需分段反转,借助哑节点与前驱指针维护连接,避免断链;两数之和利用哈希表实现O(1)查找,空间换时间,高效定位目标组合。前者考察链表指针操作,后者聚焦映射关系构建,均为面试高频题。

wuqingyigexiaoba的博客 328

排序算法深度笔记(下):非比较类排序的线性突破与工程边界

排序算法时间复杂度额外空间复杂度稳定性是否基于比较选择排序O(N^2)(O(1))不稳定是冒泡排序O(N^2)(O(1))稳定是插入排序O(N^2)(O(1))稳定是归并排序O(N\log N)(O(N))稳定是快速排序O(N\log N)O(log N)不稳定是堆排序O(N\log N)O(1)不稳定是计数排序(O(N + M))O(M))稳定否基数排序O(N)稳定否桶排序平均O(N) / 最坏O(N^2)

2401_87069538的博客 601

优选算法:分治-归并排序

交易逆序对的总数

Wangshijie1015的博客 144

算法日常・每日刷题--<动态规划>42

本题为“不相交的线”,与最长公共子序列问题相似。使用动态规划求解:定义 dp[i][j] 表示 nums1[0:i] 与 nums2[0:j] 的最大不相交连线数。若元素相等,则继承左上值加1;否则取上方或左方最大值。最终返回 dp[m][n],即两数组的最大不相交连线数。时间复杂度 O(mn),空间复杂度 O(mn)。

2503_92261635的博客 23

408 算法 06|堆与 Top-K:最小的 10 个数,到底该用数组还是堆

2022(42) 找 100 万个数里最小的 10 个,官方给了"10 元素有序数组"和"大根堆"两种答案。我把两种都实现并数了比较次数:k=10 时两者几乎打平,k=10000 时堆少 111 倍。另附 2021(42) 计数排序的比较次数与稳定性实测。

m0_56226131的博客 359

408 算法 04|主元素与三元组最小距离:两种“扫描时做决定“的思路

2013(41) 的主元素用摩尔投票一遍选出候选,但真正的考点是"选完必须验票";2020(41) 的三元组最小距离,三指针每次只挪最小的那个,靠的是 D=2×(max−min) 这个恒等式。两套完整 C 代码加真实输出,附官方评分档位表。

m0_56226131的博客 417
上一篇: P1700 [USACO19OPEN] Milk Factory B
下一篇: P1460 [USACO2.1] 健康的荷斯坦奶牛 Healthy Holsteins
谢天谢地AC了 | 信奥教练
博客等级 码龄1年 53粉丝 177原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值