Fixing the Great Wall
题意:
在一条线上,有n个坏的地方要修机器人修,机器人的移动速度V,若坏的地方立即被修花费ci,若没修,每单位时间增加d,出去机器人的开始位置,求修完n个地方的最小花费。
分析:
非常经典,求解“未来费用”的问题,考虑区间完成最后一定在区间边界上,才能保证最优。dp[i][j][k]表示修完区间长i起点为j的所有地点,k=0最后点在左边界,k=1最后点在右边界,花费最小的费用。现在考虑随着时间的花费增加的费用。时间*未走过的点的d之和为增加的费用。
dp[i][j][0]=min(dp[i-1][j+1][0]+费用,dp[i-1][j+1][1]+费用);
dp[i][j][1]=min(dp[i-1][j][0]+费用,dp[i-1][j][1]+费用);
#include <map>
#include <set>
#include <list>
#include <cmath>
#include <queue>
#include <stack>
#include <cstdio>
#include <vector>
#include <string>
#include <cctype>
#include <complex>
#include <cassert>
#include <utility>
#include <cstring>
#include <cstdlib>
#include <iostream>
#include <algorithm>
using namespace std;
typedef pair<int,int> PII;
typedef long long ll;
#define lson l,m,rt<<1
#define pi acos(-1.0)
#define rson m+1,r,rt<<11
#define All 1,N,1
#define read freopen("in.txt", "r", stdin)
const ll INFll = 0x3f3f3f3f3f3f3f3fLL;
const double INF=1e22;
const int mod = ;
struct node{
int x,d,c;
}s[];
int sum[],sx,n;
double v;
double dp[][][];
bool cmp(node a,node b){
return a.x<b.x;
}
void solve(){
sum[]=;
for(int i=;i<=n;++i)
sum[i]=sum[i-]+s[i].d;
for(int i=;i<=n;++i)
for(int j=;j<=n;++j)
{
dp[i][j][]=dp[i][j][]=INF;
}
for(int i=;i<=n;++i)
dp[][i][]=dp[][i][]=sum[n]*(abs(sx-s[i].x)/v)+s[i].c;
for(int i=;i<=n;++i)
for(int j=;j<=n;++j){
int k=j+i-;
if(k>n)break;
dp[i][j][]=min(dp[i-][j+][]+((s[j+].x-s[j].x)/v)*(sum[j]+sum[n]-sum[k])+s[j].c,
dp[i-][j+][]+((s[k].x-s[j].x)/v)*(sum[j]+sum[n]-sum[k])+s[j].c);
dp[i][j][]=min(dp[i-][j][]+((s[k].x-s[j].x)/v)*(sum[j-]+sum[n]-sum[k-])+s[k].c,
dp[i-][j][]+((s[k].x-s[k-].x)/v)*(sum[j-]+sum[n]-sum[k-])+s[k].c);
}
printf("%.0lf\n",floor(min(dp[n][][],dp[n][][])));
}
int main()
{
while(~scanf("%d%lf%d",&n,&v,&sx)){
if(n==&&v==&&sx==)break;
for(int i=;i<=n;++i)
scanf("%d%d%d",&s[i].x,&s[i].c,&s[i].d);
sort(s+,s+n+,cmp);
solve();
}
return ;
}
Fixing the Great Wall的更多相关文章
- 【暑假】[深入动态规划]UVa 10618 Fixing the Great Wall
UVa 10618 Fixing the Great Wall 题目: http://acm.hust.edu.cn/vjudge/problem/viewProblem.action?id=361 ...
- UVA-1336 Fixing the Great Wall(区间DP)
题目大意:长城(视作x正半轴)有n处破损.有一个智能修复机器人,它的初始位置和移动速度已知.每处破损处都有一组参数(x,c,d),x表示位置,c.d表示在时间t后再修复该处破损的花费为d*t+c.求用 ...
- 【杂题总汇】UVa-1336 Fixing the Great Wall
[UVA-1336]Fixing the Great Wall 一开始把题看错了……直接用的整数存储答案:之后用double存最后输出答案的时候取整就AC了
- UVa 1336 Fixing the Great Wall (区间DP)
题意:给定 n 个结点,表示要修复的点,然后机器人每秒以 v 的速度移动,初始位置在 x,然后修复结点时不花费时间,但是如果有的结点暂时没修复, 那么每秒它的费用都会增加 d,修复要花费 c,坐标是 ...
- uva1336 Fixing the Great Wall
用到了kase避免memset超时 #include<cstdio> #include<cstring> #include<cmath> #include<a ...
- 【Uva 1336】Fixing the Great Wall
[Link]: [Description] 给你长城上的n个修补点,然后你的位置为x; 你需要依次去这n个点,然后把它们全部修好. 但是修的前后顺序不一样的话,花费不一样. 如果立即把第i个点修好的话 ...
- [SinGuLaRiTy] 动态规划题目复习
[SinGuLaRiTy-1026] Copyright (c) SinGuLaRiTy 2017. All Rights Reserved. [UVA 1025] A Spy in the Metr ...
- 2021record
2021-10-14 P2577 [ZJOI2004]午餐 2021-10-13 CF815C Karen and Supermarket(小小紫题,可笑可笑) P6748 『MdOI R3』Fall ...
- [poj1113][Wall] (水平序+graham算法 求凸包)
Description Once upon a time there was a greedy King who ordered his chief Architect to build a wall ...
随机推荐
- 使用git代替FTP部署代码到服务器的例子
这篇文章主要介绍了使用git代替FTP部署代码到服务器的例子,这种方法可以节省流量.节省时间,需要的朋友可以参考下 本地开发完成后,通常会在服务器上部署,有人会使用ftp,有人会使用scp, ftp和 ...
- 嘿嘿,JAVA里第一次运行单元测试成功,立存
按书上写的单元测试. 居然一次过,爽!!! package org.smart4j.chapter2.test; import java.util.HashMap; import java.util. ...
- Oracle 学习笔记(二)
1.创建用户,一般是具有dba权限的用户才能使用: create user 用户名 identified by 密码; 2.删除用户: drop user 用户名,注意,如果用户拥有对象,则不能直接删 ...
- 手把手VirtualBox虚拟机下安装rhel6.4 linux 64位系统详细文档
下面演示安装的是在VirtualBox里安装rhel 6.4 linux 64位系统. 一.VirtualBOX 版本. 二.虚拟机的配置. 1.现在开始演示安装,一起从零开始.点击“新建”,创建新的 ...
- cygwin如何断点续传
对于Cygwin,如果想安装的东西比较多的话,推荐先选择“Download without installing”,下载完了再从本地安装. 好了,说关于断点续传.我所知道的是—— 网上有说法:下载失败 ...
- XML中如何使用schema
Schema简介 DTD的语法相当复杂,并且它不符合XML文件的标准,自成一个体系,W3C定义的Schema用来代替DTD. chema相对于DTD的明显好处是XML Schema文档本身也是XML文 ...
- lintcode : 二叉树的最小深度
题目: 二叉树的最小深度 给定一个二叉树,找出其最小深度. 二叉树的最小深度为根节点到最近叶子节点的距离. 样例 给出一棵如下的二叉树: 1 / \ 2 3 / \ 4 ...
- 解决不安装VC运行库(VC2005,VC2008),程序运行出错的方法
因为VS2005以后程序采用了manifest的生成方式,所以发布的时候要和运行库一起发布.但是我们平时开发和发布的时候如果都要客户安装运行库,那就不太方便了.你可以Microsoft下载:http: ...
- java:定义线程
Thread是java.lang包的类,默认导入. 进程:操作系统中的程序,多进程即同时运行多个程序.线程:程序中的流,多线程即程序中有多个流同时执行. 一个线程用一个线程对象表示 创建线程的方法: ...
- Android Handler传值方式
前面介绍handler的时候,也用到过几种传值方式,今天来总结一下,并且重点说一下bundle方式,代码如下: package com.handlerThread; import android.ap ...