[USACO2005 nov] Grazing on the Run【区间Dp】
Online Judge:bzoj1742,bzoj1694
Label:区间Dp
题目描述
John养了一只叫Joseph的奶牛。一次她去放牛,来到一个非常长的一片地,上面有N块地方长了茂盛的草。我们可以认为草地是一个数轴上的一些点。Joseph看到这些草非常兴奋,它想把它们全部吃光。于是它开始左右行走,吃草。John和Joseph开始的时候站在p位置。Joseph的移动速度是一个单位时间一个单位距离。不幸的是,草如果长时间不吃,就会腐败。我们定义一堆草的腐败值是从Joseph开始吃草到吃到这堆草的总时间。Joseph可不想吃太腐败的草,它请John帮它安排一个路线,使得它吃完所有的草后,总腐败值最小。John的数学很烂,她不知道该怎样做,你能帮她么?
输入
第一行两个整数N,p。表示有N处草地,奶牛初始位置为p。(\(N<=1000\))
接下来N行每行输入一个整数x,表示该处草地的坐标为x。(\(1<=x,p<=1,000,000\))
输出
输出一个整数,表示最小总腐败值。
样例
Input
4 10
1
9
11
19
Output
44
Hint
OUTPUT DETAILS:
Bessie can follow this route:
- start at position 10 at time 0
- move to position 9, arriving at time 1
- move to position 11, arriving at time 3
- move to position 19, arriving at time 11
- move to position 1, arriving at time 29
giving her a total staleness of 1+3+11+29 = 44. There are other routes
with the same total staleness, but no route with a smaller one.
题解
大致题意就是,你的初始坐标为\(x\),你要去数轴上的\(n\)个点,问你到达所有点的时间总和最小是多少。
直接贪心不可行,所以考虑dp。
坐标什么的先离散了再说:),两点的距离可以直接预处理出来\(dis[i][j]=abs(a[i]-a[j])\)。
接下来考虑如何dp。
关注到一个性质,如果到目前为止,奶牛吃过最左的草堆编号为\(l\),吃过最右的草堆编号为\(r\),则如果奶牛不是傻它肯定把\([l,r]\)的草堆都吃过了,因为它吃草速度是瞬时的,都经过了肯定要嫖一口。
那很明显应该是个区间dp了。
不难定义出状态\(f[0/1][i][j]\)表示已经吃完\([i,j]\)的草了,且现在在左端i(0),在右端j(1),所需的最少时间和。
转移根据意义模拟一下就好了,假如我现在从区间的某端\(k\)转移到某点\(l\),则花去时间为\(dis[k][l]\),在这个时间内除了区间\([i,j]\),其他所有草堆的腐败值都增加了1。
具体转移顺序可以打个记搜。也可以直接循环转移——枚举区间长度,再枚举左端点。然后对于这道题内部再分类讨论一下处于左右端位置即可。时间复杂度为\(O(N^2)\)。
代码如下
#include<bits/stdc++.h>
#define int long long
using namespace std;
const int N=1005,INF=0x3f3f3f3f;
int a[N],dis[N][N],f[N][N][2];
int n;
inline void Do(int &x,int y){(x>y)&&(x=y);}
signed main(){
int x;
scanf("%lld%lld",&n,&x);
for(int i=1;i<=n;i++)scanf("%lld",&a[i]);
a[++n]=x;
sort(a+1,a+n+1);
for(int i=1;i<=n;i++)for(int j=1;j<=n;j++)dis[i][j]=abs(a[i]-a[j]);
int st=lower_bound(a+1,a+n+1,x)-a;
memset(f,0x3f,sizeof(f));
f[st][st][0]=f[st][st][1]=0;
for(int i=1;i<=n;i++)for(int l=1;l+i-1<=n;l++){
int r=l+i-1;
if(f[l][r][0]<INF){
if(l!=1)Do(f[l-1][r][0],f[l][r][0]+dis[l-1][l]*(n-i));
if(r!=n)Do(f[l][r+1][1],f[l][r][0]+dis[l][r+1]*(n-i));
}
if(f[l][r][1]<INF){
if(l!=1)Do(f[l-1][r][0],f[l][r][1]+dis[r][l-1]*(n-i));
if(r!=n)Do(f[l][r+1][1],f[l][r][1]+dis[r][r+1]*(n-i));
}
}
printf("%lld\n",min(f[1][n][0],f[1][n][1]));
}
update
本题的几个升级版
[USACO2005 nov] Grazing on the Run【区间Dp】的更多相关文章
- BZOJ 1742: [Usaco2005 nov]Grazing on the Run 边跑边吃草( dp )
dp... dp( l , r , k ) , 表示 吃了[ l , r ] 的草 , k = 1 表示最后在 r 处 , k = 0 表示最后在 l 处 . ------------------- ...
- 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 ...
- 【bzoj1742】[Usaco2005 nov]Grazing on the Run 边跑边吃草 区间dp
题目描述 John养了一只叫Joseph的奶牛.一次她去放牛,来到一个非常长的一片地,上面有N块地方长了茂盛的草.我们可以认为草地是一个数轴上的一些点.Joseph看到这些草非常兴奋,它想把它们全部吃 ...
- bzoj 1742: [Usaco2005 nov]Grazing on the Run 边跑边吃草【区间dp】
挺好的区间dp,状态设计很好玩 一开始按套路设f[i][j],g[i][j]为吃完(i,j)区间站在i/j的最小腐败值,后来发现这样并不能保证最优 实际上是设f[i][j],g[i][j]为从i开始吃 ...
- [Usaco2005 nov]Grazing on the Run 边跑边吃草 BZOJ1742
分析: 首先,连续选择一段必定最优... 区间DP,f[i][j]表示从i开始,连续j个被吃掉了,并且,牛在i处,g[i][j]则表示在i+j-1处 f[i][j]可以从g[i+1][j]和f[i+1 ...
- BZOJ1742: [Usaco2005 nov]Grazing on the Run 边跑边吃草
数轴上n<=1000个点,从p出发以任意顺序走到所有的点,求到达每个点的时间之和的最小值. 好题!看起来水水的实际易错! 显然的结论是经过一个区间点之后肯定落在左端点或右端点上,谁没事最后还往中 ...
- BZOJ1742[Usaco2005 nov]Grazing on the Run
Description John养了一只叫Joseph的奶牛.一次她去放牛,来到一个非常长的一片地,上面有N块地方长了茂盛的草.我们可 以认为草地是一个数轴上的一些点.Joseph看到这些草非常兴奋, ...
- BZOJ 2023 [Usaco2005 Nov]Ant Counting 数蚂蚁:dp【前缀和优化】
题目链接:http://www.lydsy.com/JudgeOnline/problem.php?id=2023 题意: 有n个家族,共m只蚂蚁(n <= 1000, m <= 1000 ...
- [Baltic2009]beetle【区间Dp】
Online Judge:Bzoj1761 Label:区间Dp 题目描述 在一条直线上有N个点,每个点M升水. 一个虫子在坐标轴0点上,它每个单位时间移动一格,每个点的水每单位时间消失1升. 问虫子 ...
随机推荐
- 牛客网 NOIP赛前集训营-普及组(第四场)C--部分和 (高维前缀和)
传送门 解题思路 高维前缀和模板题.首先,求前缀和有两种方式,比如说对于求二维前缀和来说. 第一种 : for(int i=1;i<=n;i++) for(int j=1;j<=n;j++ ...
- NX二次开发-创建直线(起点-向量方向-长度)UF_CURVE_create_line
NX9+VS2012 #include <uf.h> #include <uf_curve.h> #include <uf_csys.h> #include < ...
- NX二次开发-UF_MODL_intersect_objects获取两个对象的交点
NX9+VS2012 #include <uf.h> #include <uf_curve.h> #include <uf_modl.h> #include < ...
- iOS 7.1的Safari为meta标签新增minimal-ui属性,在网页加载时隐藏地址栏与导航栏
在 iOS 7.1 的 Safari 中为 meta 标签新增 minimal-ui 属性,让网页在加载时便可隐藏顶部的地址栏与底部的导航栏. 如何实现?你只需将“minimal-ui”加入 view ...
- MySQL查询语句详解,排序、分组、聚合函数、约束
create database day20; 查询的时候from前面的字段是需要显示出来的内容,后面是条件use day20;create table phones(id int,pinpai var ...
- 【牛客提高训练营5B】旅游
题目 吉老师的题时过一年还是不会做 从\(1\)号点出发经过每条边至少一次并且还要回到\(1\)号点,这跟欧拉回路的条件非常像,但是欧拉回路的实际上是"经过每一条边恰好一次并且回到出发点&q ...
- Task 暂停与继续
static void Main(string[] args) { CancellationTokenSource tokenSource = new CancellationTokenSource( ...
- InsightFace源码以及pre-train模型以及使用
一下摘自:https://blog.csdn.net/Fire_Light_/article/details/79602705 论文链接:ArcFace: Additive Angular Margi ...
- ECharts (mark)
首页 文档 下载 实例 社区 工具 关于 2.0 EN ECharts 特性 特性 丰富的可视化类型 多种数据格式无需转换直接使用 千万数据的前端展现 移动端优化 多渲染方案,跨平台使用! 深度的交互 ...
- 廖雪峰Java16函数式编程-2Stream-2创建Stream
1. 方法1:把一个现有的序列变为Stream,它的元素是固定的 //1.直接通过Stream.of()静态方法传入可变参数进行创建 Stream<Integer> s = Stream. ...