USACO2011Open Gold Bookshelf 题解

USACO 2011 Open Gold 1.Mowing the Lawn 修剪草坪 在去年赢得了小镇的最佳草坪比赛后,约翰变得懒惰了,再也没有修剪过草坪了。现在,新一轮的比赛又开始了,约翰希望能再次夺冠。然而,约翰的草坪非常脏乱,因此,约翰需要让他的奶牛来完成这项工作。约翰有N头奶牛,平时排成一条直线,编号为1到N。每只奶牛的能力是不同的,第i头奶牛的能力为Ei。靠在一起的奶牛很熟悉,所以如果安排编号连续的K+1头奶牛在一起工作,她们就会密谋罢工 。因此,约翰需要你的帮助,如何挑选奶牛,才能使她们的 阅读详情

可以把题目理解为在n本书中”切几刀”.

     当n<=2000时就是最裸的一维DP,O(n2)可以解决:

     dp[i]表示在前i本书,第i本书为当前书架的最后一本书的最小高度.dp[i]=min{dp[j]+mx[j+1,i]}且sum[j+1,i]<=L.

 

     当n<=100000时怎么办呢?通过打表我发现dp值是不递减的!

通过dp[i]=min{dp[j]+mx[j+1,i]},当mx[j+1,i]为h[i]时,j越小越优.假设在i前面,第一本比i高的书下标为x,如果dp值在[x+1,i-1]转移,一定选择dp[x+1]来转移.(厚度允许的情况下).如果在其他区间转移呢?

 

假设当前的最大值为h[x],那么dp[k]一定为k~i-1中dp值最小的,而k是比也是在x左边比它高的第一本书y前的第一本书.那么贪心的想法就有了:

每一本书a都”管理”它前面比它小的一段

区间,如果以a为当前书架的最高值,那么就要尽可能选取这个区间靠近左端点的点来转移.

那么对于第i本书:

dp[i]=min{dp[pre[a]]+h[a]}//sum[pre[a]+1,i]<=L

pre[a]表示在a左边,第一本比a高的书的下标.

那么只要用堆来维护dp[pre[a]]+h[a],单调栈来找pre[a]即可.

注意:

①  如果a后出现了比它高的书,那么以a为最高值的状态就是无效的了.

②  别忘了题目中的厚度限定条件,当遇到sum值过大时,应当修改pre[a].

③  答案要longlong.

#include<cstdio>
#include<cstring>
#include<iostream>
#include<algorithm>
using namespace std;
const int M=2005;
const int oo=1e9+5;
int dp[M],mx[M][M],n,L,sum[M],h[M];
int main(){
    int i,j,k,x;
    scanf("%d %d",&n,&L);
    for(i=1;i<=n;i++){
        scanf("%d %d",&h[i],&x);
        sum[i]=sum[i-1]+x;
    }
    for(i=1;i<=n;i++){
        for(j=i;j<=n;j++)mx[i][j]=max(mx[i][j-1],h[j]);
    }
    for(i=1;i<=n;i++){
        dp[i]=oo;
        for(j=i-1;j>=0;j--){//[j+1,i]
            if(sum[i]-sum[j]>L)break;
            dp[i]=min(dp[i],dp[j]+mx[j+1][i]);  
        }
    }
    printf("%d\n",dp[n]);
    return 0;
}
n<=100000:
#include<cstdio>
#include<cstring>
#include<iostream>
#include<algorithm>
#include<queue> 
#define ll long long
using namespace std;
const int M=100005;
const int oo=1e9+5;
int n,L,h[M],vstk[M],pre[M],mark[M],w[M];
struct node{
    int x;
    ll v,tot;
    bool operator<(const node &tmp)const{
        return v>tmp.v;//小顶堆 
    }
};
ll dp[M],sum[M]={0};
priority_queue<node>Q;
int main(){
    int ok=1,i,j,k,x,top=0;
    scanf("%d %d",&n,&L);
    for(i=1;i<=n;i++){
        scanf("%d %d",&h[i],&w[i]);
        if(h[i]<h[i-1])ok=0;//sum[i]=sum[i-1]+x;
    }
    if(ok){//这里其实是个坑:上述算法遇到一个递减序列就会失效,所以为了防止这种情况可以把序列倒过来.
        for(i=1;i<=n/2;i++){
            swap(h[i],h[n-i+1]);
            swap(w[i],w[n-i+1]);
        }
    }
    for(i=1;i<=n;i++)sum[i]=sum[i-1]+w[i];
    h[0]=oo;
    vstk[++top]=0;
    for(i=1;i<=n;i++){
        while(top>=1&&h[vstk[top]]<=h[i]){
            mark[vstk[top]]=1;
            top--;//表示第一个比i大的数
        }
        pre[i]=vstk[top];//第一个比我大的数 
        vstk[++top]=i;
        while(sum[i]-sum[pre[i]]>L)pre[i]++;//[pre[i]+1,i]   
        dp[i]=dp[pre[i]]+h[i];
        while(!Q.empty()){
            node a=Q.top();
            if(mark[a.x]){Q.pop();continue;}
            if(sum[i]-a.tot<=L){
                dp[i]=min(a.v,dp[i]);break;
            }
            else if(sum[i]-sum[a.x-1]<=L){
                Q.pop();
                int t;
                for(j=pre[a.x]+1;j<=a.x;j++){
                    if(sum[i]-sum[j-1]<=L){
                        t=j-1;break;
                    }else mark[j]=1;
                }
                pre[a.x]=j-1;
                Q.push((node){a.x,dp[t]+h[a.x],sum[t]});
            }
            else Q.pop();//a.x到i的厚度已经超过L,那么这个状态就无效了
        }
        Q.push((node){i,dp[pre[i]]+h[i],sum[pre[i]]});
    }
    cout<<dp[n]<<endl;
    return 0;


Cartographer从安装到实战:手把手教你运行2D/3D建图与定位 本文提供了一份详尽的Cartographer从零安装到实战应用的完整指南。内容涵盖环境准备、依赖编译、源码构建等关键步骤,并手把手指导读者运行2D/3D官方数据集进行建图与定位测试。文章深入解析了参数配置与自定义数据适配方法,帮助开发者快速掌握这一强大的实时同步定位与建图工具,并将其应用于机器人导航与自动驾驶等实际场景。 阅读详情

相关推荐

akshare 布林通道策略

import datetime import pandas as pd import backtrader as bt import matplotlib.pyplot as plt from datetime import datetime import matplotlib import akshare as ak %matplotlib inline class Boll_strategy(bt.Strategy): #自定义参数,每次买入1800手 params=(('size'.

qq_26742269的博客 5341

BZOJ 2442: [Usaco2011 Open]修剪草坪

Description 在一年前赢得了小镇的最佳草坪比赛后,FJ变得很懒,再也没有修剪过草坪。现在,新一轮的最佳草坪比赛又开始了,FJ希望能够再次夺冠。然而,FJ的草坪非常脏乱,因此,FJ只能够让他的奶牛来完成这项工作。FJ有N(1 <= N <= 100,000)只排成一排的奶牛,编号为1...N。每只奶牛的效率是不同的,奶牛i的效率为E_i(0 <= E_i <= 1,...

weixin_30685047的博客 222

GB28181 2022 配置信令

基本参数视频参数选项视频参数属性配置巡航轨迹

ww506772362的专栏 1633

USACO2011Open Gold Balanced Cow Subsets

N的范围很小,可以联想到枚举子集和状压.但是如果直接枚举两个子集,显然是不够的.那么我们可以联想到折半枚举!Meet inthe Middle!     把n个数分成两部分A,B集合,答案子集的来源有以下几种: 1.    A集合的子集. 2.   B集合的子集. 3.   一部分是A的子集,一部分是B的子集. 对于1,2两种情况都可以直接预处理出: 枚举A的子集x,再枚举x的子集y,

LIN452 1167

Synopsys PCIe IP Loopback功能深度解析与应用实践

本文深入解析了Synopsys PCIe IP的Loopback功能,包括本地数字环回和远程环回两种模式的应用实践。通过详细的寄存器配置步骤和实战案例,帮助开发者快速掌握PCIe芯片验证与调试技术,提升系统开发效率。特别适合PCIe协议相关的硬件工程师和验证工程师参考。

weixin_29198045的博客 530

手机耳机麦克风(ECM)电路设计实战:从差分走线到射频干扰滤波,一个电阻引发的灵敏度问题

本文深入探讨了手机耳机麦克风(ECM)电路设计中的关键问题,从差分走线到射频干扰滤波,特别关注了一个电阻引发的灵敏度问题。通过实际案例分析,详细解析了ECM麦克风工作原理、偏置电阻选型、差分信号传输设计以及射频干扰抑制策略,为工程师提供了实用的设计指南和优化建议。

weixin_42563415的博客 244

bzoj2442[USACO2011 Open]Mowing the Lawn修建草坪

题目链接:http://www.lydsy.com/JudgeOnline/problem.php?id=2442(权限题 题目大意: 题解: 单调队列优化 听说跟初赛的烽火传递差不多,,然而我已经忘了烽火传递长什么样了orz 设f[i]表示做到i并不选i的时候,损失的最小值为多少. f[i]=min(f[j])+a[i];j要满足j<=i-k-1(默...

327

【ESP32设备通信】-两个ESP32间UART通信

在本文中,我们将使用 Arduino IDE 的 UART 硬件库在两个 ESP32 板之间执行 UART 或串行通信。 要使用 USB 端口调试和编程 ESP32,需要使用称为通用异步接收器/发送器 (UART) 通信的串行端口。 对于大多数传感器和系统,主要的通信方法被认为是 UART。 为了共享工作负载、信息和执行不同的任务,有时需要在两个 ESP32 开发板之间进行通信。

视觉与物联智能 2995

USACO2011Open Silver Running Laps题解

//请忽略我把牛看作羊.... 由题意,我们可以得到 t*vi-t*vj=kC.那么i,j相遇的次数就是最大的k(整数).为了得到最大的k就要使t最大,而tmax=L*C/vmax. 那么 把式子整理得到:      k=L*(vi-vj)/vmax.(向下取整)      对于第i只,它和速度比它小的每一只羊相遇的次数都能确定, 常见的思路就是运用前缀和把式子累加,但由于k是每两只羊之

LIN452 845

dex2oat编译优化调试

dex2oat编译调试的一些技巧和方法

jidapenglin28的专栏 5046

音乐生成 - 使用LSTM或Transformer模型进行音乐生成,如MIDI音乐生成。

在本篇博客中,我们将介绍如何使用LSTM和Transformer模型生成MIDI音乐。我们将首先概述音乐生成的一般流程,然后深入了解LSTM和Transformer模型的特点和实现。最后,我们将通过Python代码演示如何使用这两种模型生成MIDI音乐。

斌擎科技 1722

bzoj 2442: [Usaco2011 Open]修剪草坪

Description 在一年前赢得了小镇的最佳草坪比赛后,FJ变得很懒,再也没有修剪过草坪。现在, 新一轮的最佳草坪比赛又开始了,FJ希望能够再次夺冠。 然而,FJ的草坪非常脏乱,因此,FJ只能够让他的奶牛来完成这项工作。FJ有N (1 奶牛i的效率为E_i(0 靠近的奶牛们很熟悉,因此,如果FJ安排超过K只连续的奶牛,那么,这些奶牛就会罢工 去开派对:)。因此

lqybzx的专栏 996

学Simulink——四开关 Buck‑Boost(FSBB)变换器的无缝模式切换仿真

本文详细介绍了使用Simulink实现四开关Buck-Boost(FSBB)变换器无缝模式切换的仿真方法。FSBB变换器因其输入输出同极性、单电感和双向能量流特性,广泛应用于光伏储能、USB-PD和车载电源等场景。文章重点解决了模式切换中的直通风险和占空比跳变问题,通过统一电压PI控制、Stateflow模式仲裁和200ns死区设计,实现了Buck(26V→24V)、Pass-Through(24V±1V)和Boost(22V)三种工作模式的无缝过渡。仿真结果显示输出电压稳定在12V±0.15V,切换过程无

amy_mhd的博客 66

【USACO 2011 Open Gold】修剪草坪(BSOI2940)

【USACO 2011 Open Gold】修剪草坪 Description 在一年前赢得了小镇的最佳草坪比赛后,FJ变得很懒,再也没有修剪过草坪。现在,新一轮的最佳草坪比赛又开始了,FJ希望能够再次夺冠。然而,FJ的草坪非常脏乱,因此,FJ只能够让他的奶牛来完成这项工作。FJ有N(1 Input * 第一行:空格隔开的两个整数N和K * 第二到N+

袋鼠与蒟蒻 814

ssm框架搭建

这个是一个在idea上成功跑起来的ssm框架项目,保存在这里方便以后使用直接下载

大中型超市收银系统(可直接运行)

光步前台收银系统系统功能:商品销售、商品退货、挂单、收银员权限、会员销售、单品取消、整单取消、商品查询、脱机销售、脱机数据上传,基本资料下载,开钱箱、小票打印、收款结算,支持多币种付款方式(现金、储值卡、礼券、微信等),支持多种促销。运行环境:.net 4.0登陆信息用户名:1001 密码:123456内置商品信息,商品编码可输入00001000 - 00010000,测试效果相关功能键F5 结算 F9挂单 F11商品查询 F8退货 Insert单品取消 Del整单取消 F12开钱箱F2 会员 Ctrl+Z退出系统 Home 锁屏 相关源码待公开

[USACO07DEC] Bookshelf B

为了够到比最高的那头奶牛还要高的书架顶,奶牛们不得不像演杂技一般,一头站在另一头的背上,叠成一座“奶牛塔”。当然,这个塔的高度,就是塔中所有奶牛的身高之和。显然,塔中的奶牛数目越多,整座塔就越不稳定,于是奶牛们希望在能够到书架顶的前提下,让塔中奶牛的数目尽量少。Farmer John最近为奶牛们的图书馆添置了一个巨大的书架,尽管它是如此的大,但它还是几乎瞬间就被各种各样的书塞满了。思路:将奶牛身高按照从高到低排序,求前 i 个数的和sum,当sum>书架高度,则 i 为所求。头奶牛,书架的高度为。

lxtcdg的博客 289

温度PID控制PLC程序

温度PID稳定控制程序,适用于欧姆龙PLC,对其他PLC也具有很大参考价值

[USACO 2012 Open Gold] Bookshelf【优化dp】

传送门1:http://www.usaco.org/index.php?page=viewproblem2&cpid=138 传送门2:http://www.lydsy.com/JudgeOnline/problem.php?id=2678 最开始没看到要将那些书按顺序放!!一定是按顺序!我还以为是自己安排那个书架,白费了我好久时间。 然而看对题之后仍然不会。。。 令f(i)表示前...

weixin_30596165的博客 476

汉书HE8,好用的汇编代码编写工具

汉书HE8,好用的汇编代码编写工具早期编写汇编代码所用功能强大

信息学奥赛一本通 1228:书架 | OpenJudge NOI 4.6 2407:书架 | 洛谷 P2676 [USACO07DEC]Bookshelf B

【题目链接】 ybt 1228:书架 OpenJudge NOI 4.6 2407:书架 【题目考点】 1. 贪心 【解题思路】 该题可以抽象为:给定N个数,最少选出其中多少个数字,就可以使这些数的和大于等于B。 1. 贪心选择性质的证明: 贪心选择:选择其中最大的数字 证明:存在最优解包含第一次的贪心选择,即最大的数字。 假设所有的最优解都不包含最大的数字ggg,任选一个最优解,其选择的数字为a1,a2,...,ama_1, a_2, ..., a_ma1​,a2​,...,am​,将ggg与a1a

君义NOIP的博客 1903

[USACO12OPEN]书架Bookshelf

算法:DP+单调队列维护 题面描述 有N(1≤N≤100000)本书,每本书有一个宽度Wi,高度Hi,(1≤Hi≤1,000,000; 1≤Wi≤L)。 现在有足够多的书架,书架宽度最多是L (1≤L≤1,000,000,000),把书按顺序(先放1,再放2…)放入书架。某个书架的高度是该书架中所放的最高的书的高度。将所有书放入书架后,求所有书架的高度和的最小值。 输入 第1行:两个数N和L; 接...

annazsy的博客 444

JZOJ 3.10 1541——书架

题目描述 当FJ不在为奶牛挤奶、打包包裹、将他的奶牛排成一队、或是砌栅栏的时候,他喜欢坐着看一本好书。多年来他收集了N(1 <= N <= 2,000)本书,他想建立一套新的书架来保存他的书。 每本书宽W(i),高度为H(i)。书需要被按照顺序地放进书架,比如:第一个书架放了k本书,那应该是第1本到第k本,第二个书架放的书应该以第k+1本开始。每个书架可以存放宽度...

weixin_30426957的博客 268

[DP](JZOJ)【USACO Open 2012银】书架Bookshelf

题目描述 当FJ不在为奶牛挤奶、打包包裹、将他的奶牛排成一队、或是砌栅栏的时候,他喜欢坐着看一本好书。多年来他收集了N(1 <= N <= 2,000)本书,他想建立一套新的书架来保存他的书。 每本书宽W(i),高度为H(i)。书需要被按照顺序地放进书架,比如:第一个书架放了k本书,那应该是第1本到第k本,第二个书架放的书应该以第k+1本开始。每个书架可以存放宽度和至多为L(1 <= L <=1

~NULL~ 688

[USACO2012 OPEN] Bookshelf

[题目链接] https://www.lydsy.com/JudgeOnline/problem.php?id=2678 [算法] 首先不难想到如下DP : 记f[i]表示前i本书的高度和最小值 显然 , 有状态转移方程 : f[i] = min{ fj + max{hj+1 , hj+2 , ... hi...

248

洛谷P1848 [USACO12OPEN]书架Bookshelf

https://www.luogu.org/problem/show?pid=1848 这道题目的线段树简直就是水题,然后用set去做,日了狗了,搞了1个小时左右结果只过4个点,标算又看不懂,先把坑挖好; 首先这道题目的暴力dp那是显然的 f[i]可以从f[j-1]+max(h[j]……h[i])推得 不难发现无论是f[]还是当j确定的max(h[j]……h[i]),都是单调的; 那么我们

我怎么这么菜的呢 938

POJ 3268 Bookshelf 2 动态规划法题解

Description Farmer John recently bought another bookshelf for the cow library, but the shelf is getting filled up quite quickly, and now the only available space is at the top. FJ has N cows (1 ≤ 

靖空间 1794

Bookshelf题解动态规划DP

Description Robby bought a new bookshelf, and he wanted to put all his N books on it. The bookshelf contains K layers, and the heights of each layer are variable. That is, the minimum height of one layer is equal to the maximum height of all the boo

魔神翼 1121

[USACO12OPEN]Bookshelf G

题目链接:[USACO12OPEN]Bookshelf G 有一个很显然的式子: dp[i] = min{ dp[j] + max{ a[j+1]->a[i] } } 然后尺取可以找到最远的可行的j。 直接递推复杂度太高。 我们可以发现可以用单调队列维护可行区间,然后用一个multiset维护单调队列里面的最大值即可。 AC代码: #pragma GCC optimize("-Ofast","-funroll-all-loops") #include<bits/stdc++.h> #d

青烟绕指柔的博客 582

[Luogu1848][USACO12OPEN]书架Bookshelf DP+set+决策单调性

题目链接:https://www.luogu.org/problem/show?pid=1848 题目要求书必须按顺序放,其实就是要求是连续的一段。于是就有DP方程$$f[i]=min\{f[j]+max\{h_k\}\}$$其中的k以及j的关系应该满足$$\sum_{k=j+1}^iw_k<=L$$ 这样是$O(n^2)$的肯定不行。发现对于一个$h[i]$到前一个比它大的$...

weixin_30477293的博客 175
上一篇: USACO2011Open Silver Unlocking Blocks 题解
下一篇: USACO2011Open Gold Balanced Cow Subsets
LIN452
博客等级 码龄10年 10粉丝 38原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值