初三年后集训测试 $T 2 $ 牛吃草

一言难尽

$$HZOI$$

$ Description $

由于现代化进程的加快,农场的养殖业也趋向机械化。

\(QZS\) 决定购置若干台自动喂草机来减少自己每天的工作量。为了简化问题,\(QZS\) 决定将草地建模成一条线段,总长为 \(n\) ,即共有 \(n\) 个单位长度,编号从左至右为 $ 1 \dots n $ 。

\(QZS\) 可以在每个单位长度独立选择是否放置一台自动喂草机。由于场地的限制,喂草机一旦在 \(i\) 处放下,它只能往左边延伸覆盖一个从 \(i\) 开始的完整区间,且延伸的距离不能超过 \(w_i\)

,即最多到编号为 $ i - w[ i ] + 1 $

的单位长度。同时为了小草的健康着想,营养不能太丰富,因此每个单位长度只能被一台自动喂草机覆盖。

\(QZS\) 想使得每台喂草机的覆盖大小达到一个最低标准以节省费用,若喂草机覆盖 $ [ l , r ] $

,那么覆盖大小为 $ [ r - l + 1 ] $

。他规定一台喂草机最小覆盖大小为 \(size\) 。所以如果一台喂草机的覆盖大小 \(<size\) ,说明这个位置不能放置喂草机。

现在,\(QZS\) 想知道,如果喂草机覆盖的总大小仅需达到草地总长的 \(s\%\),最小覆盖大小最大是多少?

\(Input\)

输入共三行。

第一行输入整数 \(n\) 。

第二行输入 \(n\) 个整数

,表示第 \(i\) 个位置的延伸距离不能达到

最后一行给定整数 \(s\) ,意义如上述所示。

\(Output\)

输出一个整数 \(Size\) ,意思同上

(注意: \(size\) 并非从 \(w_i\) 中取值 )

数据大小

$1 \le s \le 100 , 2 \le i \le n , \color{red}w_{ i - 1 } \geq w_i - 1 $


题解


·暴力


首先一眼的 \(二分答案\) , 然后在 \(Check\) 函数里考虑 \(DP\) .

问题是怎么 \(DP\)

首先考虑定义个 \(DP\) 数组,表示前 \(i\) 个中,最小的最大 \(size\) .

那么二分的是你最后的输出的答案。

枚举 \(j\) 为前端节点,则转移方程为:

\[dp_{ i } = \max( \ dp_{ i - 1 } , dp_{ j } + i - j \ ) ( i - j \ge mid \ 且 \ i - j \le w_i )
\]

时间复杂度为 \(O(\ n^2\times logn \ )\) 由于数据水的 \(原\) (神) \(因\) , 本题可拿 \(\color{green}95pts\)


·正解


·正解是什么

下面讲一下正解之 \(---\) 单调队列优化 \(DP\) .

观察上方标红的数据大小的位置。(四非常纵要滴)

他的意义是什么捏?

给他转化一下,得到的意思是:

第 $ i $ 个位置可以控到的最左端 , 永远小于等于第 $ i - 1 $ 个位置的可以控到的最左端.

那么他的意思就很明确了。

你的右端点最后返回的 \(DP\) 值,一定是从某个左端点转移过来的。

你想一想在你跑单队的过程中,是不是如果你现在队顶的元素不符合条件的话,那么就让他滚出队列?

假设第 \(i\) 个数的左端点是在第 $ i - 1 $ 的左端点的左边的话,那么这个由于你在枚举第 $ i - 1 $ 个元素时,

第 \(i\) 个元素的左端点就被排出去了。单队,寄。

但现在,他给了个这么优秀的条件,不打单队对不起他。


·正解怎么做

首先,使用二分答案,左端点是1,右端点是 \(w_{ max }\)

然后的话,在 \(Check\) 函数里,调用 \(DP\)

使单调队列维护的是 $ dp[ \ l \ ] - l $

然后注意,你能使某个位置被放进队列里的条件是此数大于 \(mid\) , 且在枚举 \(i\) 的时候 放入 $ i - mid $

此处的依据:

如果你早在枚举 $ i - mid $ 时就将其放入队列 , 那么在当他被 \(( i - mid , i )\) 区间内某个数判断时,有可能被 $pushfront() \ or \ pushback() $ 掉。

那就寄了。所以这么维护。

细节看码吧。

关于我在单队中插入元素时加了一个 \(n\) (其实加不加无所谓的)

因为 $ dp[ \ l \ ] - l $ 这个东西是可能负的,我给强转正。但没什么用。


· \(Code\)

点击查看代码
#include<bits/stdc++.h>
#define int long long
using namespace std ;
const int N = 5e5 + 4 ;
int n , s ;
int w[ N ] ;
int dp[ N ] ;
int maxn = 0 , minn = 1e7 ;
namespace IO {
.........//qcin && qcout
} using namespace IO;
struct Deque
{
int q[ N ] ;
int head = 1 , tail = 0 ;
void clear( )
{
memset( q , 0 , sizeof( q ) ) ;
head = 1 ; tail = 0 ;
}
int front( )
{
return q[ head ] ;
}
int back( )
{
return q[ tail ] ;
}
void push_back( int pri )
{
q[ ++ tail ] = pri ;
}
void pop_front( )
{
head ++ ;
}
void pop_back( )
{
tail -- ;
}
bool empty( )
{
return head > tail ;
}
} q ;
bool check( int mid )
{
q.clear( ) ;
for ( int i = 1 ; i<= n ; ++ i )
{
dp[ i ] = 0 ;
}
int p = 0 ;
for ( int i = 1 ; i <= n ; ++ i )
{
if( i >= mid )
{
int point = i - mid ;
while ( !q.empty( ) && dp[ point ] + n - point > dp[ q.back( ) ] + n - q.back( ) )
{
q.pop_back( ) ;
}
q.push_back( point ) ;
}
dp[ i ] = dp[ i - 1 ] ;
while ( !q.empty( ) && i - q.front( ) > w[ i ] ) q.pop_front( ) ;
if( q.empty( ) ) ;
else dp[ i ] = max( dp[ i ] , dp[ q.front( ) ] + i - q.front( ) ) ;
p = max( p , dp[ i ] ) ;
}
return p >= ( n * s - 1 ) / 100 + 1 ;
}
signed main( )
{
#ifndef ONLINE_JUDGE
freopen ( "1.in" , "r" , stdin ) ;
freopen ( "1.out" , "w" , stdout ) ;
#endif
qcin >> n ;
for ( int i = 1 ; i <= n ; ++ i )
{
qcin >> w[ i ] ;
maxn = max( maxn , w[ i ] ) ;
minn = min( minn , w[ i ] ) ;
}
qcin >> s ;
int left = 1 , right = maxn ;
int ans = 0 ;
while ( left <= right )
{
int mid = ( left + right ) >> 1 ;
if( check( mid ) )
{
left = mid + 1 ;
}
else
{
right = mid - 1 ;
}
}
qcout << right ;
}

· 结尾撒花 \(\color{pink}✿✿ヽ(°▽°)ノ✿\)

初三年后集训测试 T2--牛吃草的更多相关文章

  1. 模拟水题,牛吃草(POJ2459)

    题目链接:http://poj.org/problem?id=2459 题目大意:有C头牛,下面有C行,每头牛放进草地的时间,每天吃一个草,总共有F1个草,想要在第D的时候,草地只剩下F2个草. 解题 ...

  2. zstuoj 4243 牛吃草 ——(二分+两圆交)

    这题上次补了以后忘记写博客了,现在补一下. 有两个注意点,第一是两圆相交的模板.可以通过任意一种情况手推出来. 第二是,实数二分要注意不用ans记录为妙,因为可能因为eps过小,导致ans无法进入记录 ...

  3. zstu-4243 牛吃草

    贴一发两圆相交面积模板 #include<bits/stdc++.h> #define pi acos(-1.0) using namespace std; ; double _abs(d ...

  4. bzoj1742[Usaco2005 nov]Grazing on the Run 边跑边吃草*&&bzoj3074[Usaco2013 Mar]The Cow Run*

    bzoj1742[Usaco2005 nov]Grazing on the Run 边跑边吃草 bzoj3074[Usaco2013 Mar]The Cow Run 题意: 数轴上有n棵草,牛初始在L ...

  5. BZOJ 1742: [Usaco2005 nov]Grazing on the Run 边跑边吃草( dp )

    dp... dp( l , r , k )  , 表示 吃了[ l , r ] 的草 , k = 1 表示最后在 r 处 , k = 0 表示最后在 l 处 . ------------------- ...

  6. 【bzoj1742】[Usaco2005 nov]Grazing on the Run 边跑边吃草 区间dp

    题目描述 John养了一只叫Joseph的奶牛.一次她去放牛,来到一个非常长的一片地,上面有N块地方长了茂盛的草.我们可以认为草地是一个数轴上的一些点.Joseph看到这些草非常兴奋,它想把它们全部吃 ...

  7. noip2019集训测试赛(二十一)Problem B: 红蓝树

    noip2019集训测试赛(二十一)Problem B: 红蓝树 Description 有一棵N个点,顶点标号为1到N的树.N−1条边中的第i条边连接顶点ai和bi.每条边在初始时被染成蓝色.高桥君 ...

  8. 国庆集训 Day1 T2 生成图 DP

    国庆集训 Day1 T2 生成图 现在要生成一张\(n\)个点的有向图.要求满足: 1.若有 a->b的边,则有 b->a 的边 2.若有 a->b 的边和 b->c 的边,则 ...

  9. FJ省队集训最终测试 T2

    思路:发现如果一个人一共选了x个点,那么选中某一个点对的概率都是一样的,一个人选x个点的总方案是C(n,x),一个人选中某个点对的总方案是C(n-2,x-2),这样,那么选中某个点对的概率就是 x*( ...

  10. 2018.10.22 bzoj1742: Grazing on the Run 边跑边吃草(区间dp)

    传送门 区间dp入门题. 可以想到当前吃掉的草一定是一个区间(因为经过的草一定会吃掉). 然后最后一定会停在左端点或者右端点. f[i][j][0/1]f[i][j][0/1]f[i][j][0/1] ...

随机推荐

  1. PyTorch程序练习(二):循环神经网络的PyTorch实现

    一.RNN实现 结构原理 代码实现 import torch import torch.nn as nn class RNN(nn.Module): def __init__(self, input_ ...

  2. Power BI进阶秘籍,干货满满!如何将度量值转化为切片器(动态切换分析指标),实操指南来了!

    Power BI进阶秘籍,干货满满!如何将度量值转化为切片器(动态切换分析指标),实操指南来了!   想要在Power BI中让度量值也能像维度一样灵活筛选?没问题,这里就为你揭秘如何将度量值转化为切 ...

  3. Node.js中的模块

    CommonJS模块 CommonJS是一种规范,它定义了JavaScript 在服务端运行所必备的基础能力,比如:模块化.IO.进程管理等.其中,模块化方案影响深远,其对模块的定义如下: 1,模块引 ...

  4. Nuxt3 的生命周期和钩子函数(十一)

    title: Nuxt3 的生命周期和钩子函数(十一) date: 2024/7/5 updated: 2024/7/5 author: cmdragon excerpt: 摘要:本文详细介绍了Nux ...

  5. GCC8 编译优化 BUG 导致的内存泄漏

    1. 背景 1.1. 接手老系统 最近我们又接手了一套老系统,老系统的迭代效率和稳定性较差,我们打算做重构改造,但重构周期较长,在改造完成之前还有大量的需求迭代.因此我们打算先从稳定性和迭代效率出发做 ...

  6. 2024-07-13:用go语言,给定一个从0开始的长度为n的整数数组nums和一个从0开始的长度为m的整数数组pattern,其中pattern数组仅包含整数-1、0和1。 一个子数组nums[i.

    2024-07-13:用go语言,给定一个从0开始的长度为n的整数数组nums和一个从0开始的长度为m的整数数组pattern,其中pattern数组仅包含整数-1.0和1. 一个子数组nums[i. ...

  7. iOS开发基础135-Core Data

    Objective-C (OC) 中使用 Core Data 是iOS应用开发中管理模型层对象的一种有效工具.Core Data 使用 ORM (对象关系映射) 技术来抽象化和管理数据.这不仅可以节省 ...

  8. 前端使用 Konva 实现可视化设计器(18)- 素材嵌套 - 加载阶段

    本章主要实现素材的嵌套(加载阶段)这意味着可以拖入画布的对象,不只是图片素材,还可以是嵌套的图片和图形. 请大家动动小手,给我一个免费的 Star 吧~ 大家如果发现了 Bug,欢迎来提 Issue ...

  9. 14、SpringMVC之注解配置

    14.1.概述 在实际工作中,一般使用配置类和注解代替web.xml和SpringMVC配置文件的功能: 在 Servlet3.0 环境中,容器会在类路径中查找实现了 javax.servlet.Se ...

  10. 【SpringMVC】08 Post请求乱码

    这是以Post请求方式接受来的中文字符乱码 就像之前JavaWeb阶段的情况一样 所以,按照JavaWeb的方法,我们应该只需要在获取之前设置好编码处理就行了 可以先从这个处理方法开始试试,但是参数在 ...