【题目链接】 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. Git命令文本手册

    git init # 初始化本地git仓库(创建新仓库) git config --global user.name "xxx" # 配置用户名 git config --glob ...

  2. Nginx中的长连接

    在nginx中,对于http1.0与http1.1是支持长连接的 我们知道,http请求是基于TCP协议之上的,那么,当客户端在发起请求前,需要先与服务端建立TCP连接,而每一次的TCP连接是需要三次 ...

  3. svn备份

    公司的svn体量很大,要是一不小心误删了SVN版本库,就要哭了,所以有了下面的备份脚本 #每个版本库完全备份 #!/bin/bash SOUR_SVN="/var/www/svn" ...

  4. Spring securiuty 过滤器

    1. HttpSessionContextIntegrationFilter 位于过滤器顶端,第一个起作用的过滤器. 用途一,在执行其他过滤器之前,率先判断用户的session中是否已经存在一个Sec ...

  5. 【SPOJ - QTREE2】树链剖分

    http://acm.hust.edu.cn/vjudge/problem/19960 题意: 有一棵N个节点的树(1<=N<=10000),N-1条边,边的编号为1~N-1,每条边有一个 ...

  6. 【Foreign】置换 [数论][置换]

    置换 Time Limit: 10 Sec  Memory Limit: 256 MB Description Input Output Sample Input 4 2 1 4 3 Sample O ...

  7. 用 letsencrypt 生成 SSL 证书

    letsencrypt 生成 SSL 证书 事先配置好访问域名解析 在nginx 对应虚拟主机添加一个验证区域: 配置 nginx server { listen 80; ... location ~ ...

  8. TensorFlow_曲线拟合

    # coding:utf-8 import tensorflow as tf import numpy as np import matplotlib.pyplot as plt import os ...

  9. 转:java读取配置文件的几种方法

    转自: http://www.iteye.com/topic/56496 在现实工作中,我们常常需要保存一些系统配置信息,大家一般都会选择配置文件来完成,本文根据笔者工作中用到的读取配置文件的方法小小 ...

  10. linux察看安装包有那些

    rpm -ql  zsh |more  安装完之后,产生那些内容 which zsh rpm -qpl /mnt/packages/ rpm -Uvh /mnt/packages/lrzsz-0.2. ...