【题目链接】 http://acm.timus.ru/problem.aspx?space=1&num=2072

【题目大意】

  一个园丁要给一排花浇水,每个花都有一个标号,必须要先浇标号小的,
  移动一格需要一单位时间,浇花需要一单位时间,园丁一开始在最左边的花处,
  问浇完所有花的最短时间

【题解】

  同一标号的花从开始浇水到结束,最优的一定是从最左边走到最右边
  或者从最右边到最左边,所以我们将每种标号的花的最左和最右作为状态做单调dp,
  就能得到答案。

【代码】

#include <cstdio>
#include <algorithm>
#include <cmath>
#include <cstring>
using namespace std;
const int MAX_N=200010;
int L[MAX_N],R[MAX_N];
long long dp[MAX_N][2];
int n,m,s[MAX_N],disc[MAX_N],a[MAX_N];
int remark(int x){
int l=1,r=m;
while(l<=r){
int mid=(l+r)>>1;
if(disc[mid]<x)l=mid+1;
else if(disc[mid]==x)return mid;
else r=mid-1;
}
}
int main(){
while(~scanf("%d",&n)){
memset(s,0,sizeof(s));
for(int i=1;i<=n;i++)scanf("%d",&a[i]),disc[i]=a[i];
sort(disc+1,disc+n+1);
m=unique(disc+1,disc+n+1)-(disc+1);
memset(dp,0x3f,sizeof(dp));
for(int i=1;i<=n;i++)a[i]=remark(a[i]);
for(int i=1;i<=n;i++){
if(!L[a[i]])L[a[i]]=i;
R[a[i]]=i;
s[a[i]]++;
}L[0]=1; R[0]=1;
dp[0][0]=dp[0][1]=0;
for(int i=1;i<=m;i++){
dp[i][0]=min(dp[i][0],dp[i-1][0]+s[i]+abs(R[i]-L[i-1])+R[i]-L[i]);
dp[i][0]=min(dp[i][0],dp[i-1][1]+s[i]+abs(R[i]-R[i-1])+R[i]-L[i]);
dp[i][1]=min(dp[i][1],dp[i-1][0]+s[i]+abs(L[i]-L[i-1])+R[i]-L[i]);
dp[i][1]=min(dp[i][1],dp[i-1][1]+s[i]+abs(L[i]-R[i-1])+R[i]-L[i]);
}printf("%lld\n",min(dp[m][1],dp[m][0]));
}return 0;
}

URAL 2072 Kirill the Gardener 3 (单调DP)的更多相关文章

  1. URAL 2072 Kirill the Gardener 3

    URAL 2072 思路: dp+离散化 由于湿度的范围很大,所以将湿度离散化 可以证明,先到一种湿度的最左端或者最右端,然后结束于最右端或最左端最优,因为如果结束于中间,肯定有重复走的路 状态:dp ...

  2. Ural 2072:Kirill the Gardener 3(DP)

    http://acm.timus.ru/problem.aspx?space=1&num=2072 题意:有n朵花,每朵花有一个饥渴值.现在浇花,优先浇饥渴值小的(即从小到大浇),浇花需要耗费 ...

  3. 2072. Kirill the Gardener 3

    http://acm.timus.ru/problem.aspx?space=1&num=2072 回忆一下 #include <iostream> #include <st ...

  4. BZOJ 1633 [Usaco2007 Feb]The Cow Lexicon 牛的词典(单调DP)

    [题目链接] http://www.lydsy.com/JudgeOnline/problem.php?id=1633 [题目大意] 给出一个字符串和一个字符串集, 问要删去多少个字符该字符串才可以被 ...

  5. URAL 1012 K-based Numbers. Version 2(DP+高精度)

    题目链接 题意 :与1009一样,不过这个题的数据范围变大. 思路:因为数据范围变大,所以要用大数模拟,用java也行,大数模拟也没什么不过变成二维再做就行了呗.当然也可以先把所有的都进行打表,不过要 ...

  6. Codeforces 713C Sonya and Problem Wihtout a Legend(单调DP)

    [题目链接] http://codeforces.com/problemset/problem/713/C [题目大意] 给出一个数列,请你经过调整使得其成为严格单调递增的数列,调整就是给某些位置加上 ...

  7. BZOJ 4367 [IOI2014]holiday (决策单调DP+主席树+分治)

    题目大意:略 题目传送门 神题,不写长题解简直是浪费了这道题 贪心 考虑从0节点出发的情况,显然一直往前走不回头才是最优策略 如果起点是在中间某个节点$s$,容易想到,如果既要游览$s$左边的某些景点 ...

  8. Ural 1152 False Mirrors(状压DP)

    题目地址:space=1&num=1152">Ural 1152 初学状压DP,原来状压仅仅是用到了个位运算.. 非常水的状压DP.注意四则运算的优先级是高于位运算的..也就是 ...

  9. Ural 1225. Flags 斐波那契DP

    1225. Flags Time limit: 1.0 secondMemory limit: 64 MB On the Day of the Flag of Russia a shop-owner ...

随机推荐

  1. 【BZOJ 1647】[Usaco2007 Open]Fliptile 翻格子游戏 模拟、搜索

    第一步我们发现对于每一个格子,我们只有翻和不翻两种状态,我们发现一旦确定了第一行操作,那么第二行的操作也就随之确定了,因为第一行操作之后我们要想得到答案就得把第一行全部为0,那么第二行的每一个格子的操 ...

  2. linux 条件判断式

    1.利用if ...then if [ 判断条件 ];then 指令 fi 实例一 Y/N: #!/bin/bash #Program: # This program shows "Hell ...

  3. eclipse安装反编译插件jadclipse

    下载jadClipse地址: 目的:将一些封装的jar或者sdk可以查看源代码 链接: http://pan.baidu.com/s/1kTN4TPd  提取码: 3fvd 将net.sf.jadcl ...

  4. OSI 七层模型和 TCP/IP 四层模型 及 相关网络协议

    简介 OSI 是理论上的模型,也就是一个统一的国际标准,现在的很多网络设备或者是网络协议都不同程度的精简了自己的所谓的模型,那么他们为了自己的通讯兼容都会参考这个OSI模型 TCP/IP 包括: TC ...

  5. Install Rancher server

    1.pre-requirement: sudo nmtui # sudo hostnamectl set-hostname <hostname> $ sudo hostnamectl se ...

  6. Java多线程-一个简单的线程,实现挂起和恢复的功能

    public class MySprite implements Runnable { /* * 线程用变量 */ private boolean running = false; private b ...

  7. js实现日历

    有这样一个普通的日历需求 第一反应就是找插件,结果找到了,但是改起来非常麻烦,然后查下实现的原理,发现原来很简单,于是自己实现了一个. 首先分析一下这个组件,每页显示的是 当前月的所有日期及所占据的行 ...

  8. Ubuntu下kafka集群环境搭建及测试

    kafka介绍: Kafka[1是一种高吞吐量[2]  的分布式发布订阅消息系统,有如下特性: 通过O(1)的磁盘数据结构提供消息的持久化,这种结构对于即使数以TB的消息存储也能够保持长时间的稳定性能 ...

  9. 【bzoj1597- [Usaco2008 Mar]土地购买】斜率优化

    [597][Usaco2008 Mar]土地购买 [题目描述] 有N (1 <= N <= 50,000) 块长方形的土地. 每块土地的长宽满足(1 <= 宽 <= 1,000 ...

  10. 【FJWC2017】交错和查询 [线段树]

    交错和查询 Time Limit: 10 Sec  Memory Limit: 256 MB Description 无限循环数字串S由长度为n的循环节s构成.设s为12345(n=5),则数字串S为 ...