http://acm.timus.ru/problem.aspx?space=1&num=2072

题意:有n朵花,每朵花有一个饥渴值。现在浇花,优先浇饥渴值小的(即从小到大浇),浇花需要耗费1个单位时间,从第i个位置走到第j个位置需要耗费abs(j-i)个单位时间,问浇完所有的花需要耗费的最少时间是多少。

思路:考虑到有饥渴值一样的花,那么只要考虑怎么在饥渴值相同的情况下取最优,那问题便可以迎刃而解了。

首先想,要让时间耗费的少,那么就尽量不要走重复的路程,所以想到这里,可以确定:对于某一个饥渴值x,一定是从饥渴值为x的最左边的位置走到饥渴值为x的最右边的位置,或者从最右边的位置走到最左边。因为这样就可以变成一条直线了,不会走多余的路程。

考虑到我们只需要知道每个饥渴值对应的最左边和最右边的位置,因此我们只要处理出Left[i],Right[i]数组即可。因为数据大,所以需要离散化。

定义两个状态:dp[i][0]为走到饥渴值为i的花的时候从最左边走到最右边耗费的最短时间,dp[i][1]为走到饥渴值为i的花的时候从最右边走到最左边耗费的最短时间。

知道这两个状态后,转移方程就不难列出:

dp[i][0] = Right[i] - Left[i] + min(dp[i-1][1] + abs(Left[i-1] - Left[i]), dp[i-1][0] + abs(Right[i-1] - Left[i]));

dp[i][1] = Right[i] - Left[i] + min(dp[i-1][1] + abs(Left[i-1] - Right[i]), dp[i-1][0] + abs(Right[i-1] - Right[i]));

注意要用longlong。可怜的队友因为这个抓狂了一个下午。

 #include <bits/stdc++.h>
using namespace std;
typedef long long LL;
#define N 100005
#define INF 0x3f3f3f3f
LL dp[N][], a[N], b[N]; int Left[N], Right[N];
// dp[i][0] Left -> Right , dp[i][1] Right -> Left int main() {
int n;
while(~scanf("%d", &n)) {
for(int i = ; i <= n; i++) scanf("%lld", &a[i]), b[i] = a[i];
sort(b + , b + + n);
int cnt = unique(b + , b + + n) - b - ;
memset(Left, INF, sizeof(Left));
for(int i = ; i <= n; i++) { // 离散化
a[i] = lower_bound(b + , b + + cnt, a[i]) - b;
Left[a[i]] = min(Left[a[i]], i);
Right[a[i]] = max(Right[a[i]], i);
}
dp[][] = Right[] - ; // 走到右端
dp[][] = Right[] - Left[] + Right[] - ; // 先到右端再走到左端
for(int i = ; i <= cnt; i++) {
int dis = Right[i] - Left[i];
dp[i][] = min(dp[i-][] + abs(Left[i-] - Left[i]), dp[i-][] + abs(Right[i-] - Left[i])) + dis;
dp[i][] = min(dp[i-][] + abs(Left[i-] - Right[i]), dp[i-][] + abs(Right[i-] - Right[i])) + dis;
}
printf("%lld\n", min(dp[cnt][], dp[cnt][]) + n);
}
return ;
}

Ural 2072:Kirill the Gardener 3(DP)的更多相关文章

  1. Ural 1353 Milliard Vasya&#39;s Function(DP)

    题目地址:Ural 1353 定义dp[i][j].表示当前位数为i位时,各位数和为j的个数. 对于第i位数来说.总能够看成在前i-1位后面加上一个0~9.所以状态转移方程就非常easy出来了: dp ...

  2. HDU 1024:Max Sum Plus Plus(DP)

    http://acm.hdu.edu.cn/showproblem.php?pid=1024 Max Sum Plus Plus Problem Description Now I think you ...

  3. Codeforces 766C:Mahmoud and a Message(DP)

    题目链接:http://codeforces.com/problemset/problem/766/C 题意 有一个长度为n的字符串,第二行有26个数字,位置1~26对应为a~z的字母,数值表示该字母 ...

  4. 架构设计:负载均衡层设计方案(3)——Nginx进阶

    版权声明:欢迎转载,但是看在我辛勤劳动的份上,请注明来源:http://blog.csdn.net/yinwenjie(未经允许严禁用于商业用途!) 目录(?)[-] Nginx继续进阶 1gzip ...

  5. 架构设计:负载均衡层设计方案(2)——Nginx安装

    来源:http://blog.csdn.net/yinwenjie(未经允许严禁用于商业用途!) 目录(?)[-] Nginx重要算法介绍 1一致性Hash算法 2轮询与加权轮询 Nginx的安装 1 ...

  6. Vue 源码解析:深入响应式原理(上)

    原文链接:http://www.imooc.com/article/14466 Vue.js 最显著的功能就是响应式系统,它是一个典型的 MVVM 框架,模型(Model)只是普通的 JavaScri ...

  7. Java入门记(五):容器关系的梳理(下)——Map

    注意:阅读本文及相关源码时,需要数据结构相关知识,包括:哈希表.链表.红黑树. Map是将键(key)映射到值(value)的对象.不同的映射不能包含相同的键:每个键最多只能映射到一个值.下图是常见M ...

  8. Java并发编程:并发容器之CopyOnWriteArrayList(转载)

    Java并发编程:并发容器之CopyOnWriteArrayList(转载) 原文链接: http://ifeve.com/java-copy-on-write/ Copy-On-Write简称COW ...

  9. Java并发编程:并发容器之ConcurrentHashMap(转载)

    Java并发编程:并发容器之ConcurrentHashMap(转载) 下面这部分内容转载自: http://www.haogongju.net/art/2350374 JDK5中添加了新的concu ...

随机推荐

  1. Qt5.8 下链接 Mysql 错误以及解决方法(无论 Mysql 是什么版本的,64 位 Qt 要用 64 位的 Mysql 驱动,32 位的 Qt 要用 32 位的Mysql 驱动)

    Qt 5.8 下链接 Mysql(Windows 平台下),有朋友会出现一个这个无法连接的错误 QSqlDatabase: QMYSQL driver not loaded QSqlDatabase: ...

  2. Sqlite在.NET下的使用和Sqlite数据库清理

    原文:Sqlite在.NET下的使用和Sqlite数据库清理 Sqlite 是一款轻量级的关系型数据库,她的好处我就不详细道来了.本文的初衷是为.net平台的使用者提供帮助. Sqlite有专门为VS ...

  3. MVVM模式的几个开源框架

    原文:MVVM模式的几个开源框架 实现MVVM的框架有很多,如: • MVVM Light Toolkit: http://mvvmlight.codeplex.com • Microsoft Pri ...

  4. Android 查看App冷启动时间/热启动时间/页面打开时间

    Android 查看App冷启动时间/热启动时间/页面打开时间 冷启动时间 热启动时间 页面打开时间 通过adb查看 adb shell am start -W packageName/Activit ...

  5. Image Captioning代码复现

    Image caption generation: https://github.com/eladhoffer/captionGen Simple encoder-decoder image capt ...

  6. 零元学Expression Blend 4 &ndash; Chapter 43 如何指定Childwindow PopUp位置

    原文:零元学Expression Blend 4 – Chapter 43 如何指定Childwindow PopUp位置 有网友询问我有关Childwindow是否能指定弹出位置? 其实只要透过小小 ...

  7. 零元学Expression Blend 4 - Chapter 1 缘起

    原文:零元学Expression Blend 4 - Chapter 1 缘起 本来都使用Adobe相关工具从事设计工作的我,因缘际会下,接触到了Expression Blend 4,让我完全的对微软 ...

  8. Android零基础入门第89节:Fragment回退栈及弹出方法

    在上一期分享的文章末尾留了一个课后作业,有去思考如何解决吗?如果已经会了那么恭喜你,如果还不会也没关系,本期一起来学习. 一.回退栈 在前面两期的示例中,当我们完成一些操作后,如果想要回到操作之前的状 ...

  9. asp.net ToString() 格式化字符串

    c# ToString() 格式化字符串  格式化数值:有时,我们可能需要将数值以一定的格式来呈现,就需要对数值进行格式化.我们使用格式字符串指定格式.格式字符串采用以下形式:Axx,其中 A 为格式 ...

  10. 修改用户名后TSF出现"需要本地工作区。工作区 xxx 并未驻留在本计算机上"

    解决方法就是:1,打开vs下的"开发人员命令提示"2,按下面格式输入命令:tf workspaces /collection:http://192.168.0.110:8080/t ...