UVa 10618 Fixing the Great Wall

题目:

 http://acm.hust.edu.cn/vjudge/problem/viewProblem.action?id=36139

思路:

  数轴上有n个点需要修复,每个点有信息c,x,d 表示位于x且在t时修缮的费用是c+d*t,找一个修缮序列使n个点能全部修缮且有费用最小。

可以发现:在任意时刻,修缮完的点都是连续的,因为修缮不需要时间,将一些点“顺手”修缮了肯定不差。

d[i][j][k],表示已经将i-j个点修缮完后位于p(if (k==0) p=i;else p=j;)的花费,不知道时间怎么办呢?

:注意到每个点的花费是c+d*t ,累计花费并不一定要将每个点的花费都求出来然后相加。于是正式定义d表示该清情况下所有已知花费,每当因为移动时间耗去t所有没有访问的点u花费都会相应增加u.d*t,总花费增加sum_d*t。换句话说,这种方法根据花费的特点将单个点花费累加变成了累计未访问点在未访问时间内的花费。

当位于ijk时有两种抉择:左走i-1 j 0 或右走 i j+1 1 这就是子问题 。

答案不大于10^9 但过程中好像input中会出现超int的情况但long long空间占用太大,因此用了double,最后转成int。

代码:

 #include<cstdio>
#include<cstring>
#include<cmath>
#include<algorithm>
#define FOR(a,b,c) for(int a=(b);a<(c);a++)
using namespace std; const int maxn = + ;
const int INF = 1e30; struct Node{
double x,c,d;
bool operator <(const Node& rhs) const {
return x<rhs.x; }
};
Node nodes[maxn]; int n,kase;
double v,x,d[maxn][maxn][];
//d记录目前已知的所有花费
double pre_d[maxn];
int vis[maxn][maxn][]; inline double cost(double x,double y,int i,int j) {
double finished=;
if(i>j) return 0.0;
if(i>= && j>=) finished += pre_d[j]-pre_d[i-]; //sum_d[i,j]
return (pre_d[n]-finished) * fabs(y-x)/v; //总花费+所有未访问的点.d*t
} double dp(int i,int j,int k) {
if(i== && j==n) return ; // 边界
double& ans=d[i][j][k];
if(vis[i][j][k]==kase) return ans;
vis[i][j][k]=kase; //记忆化搜索 ans=INF;
double x=(k==? nodes[i].x:nodes[j].x);
if(i>) ans=min(ans,dp(i-,j,) + cost(x,nodes[i-].x,i,j));
if(j<n) ans=min(ans,dp(i,j+,) + cost(x,nodes[j+].x,i,j));
return ans;
} int main() {
kase=;
memset(vis,,sizeof(vis));
while(scanf("%d%lf%lf",&n,&v,&x)== && (n&&v&&x)) {
++kase;
double sumc=;
FOR(i,,n+){
scanf("%lf%lf%lf",&nodes[i].x,&nodes[i].c,&nodes[i].d);
sumc += nodes[i].c;
}
sort(nodes+,nodes+n+); pre_d[]=;
FOR(i,,n+) pre_d[i]=pre_d[i-]+nodes[i].d; //'哨兵' 如果初始点在第0个点的左或第n个点的右 //使满足判断的普遍性
nodes[].x=-INF;
nodes[n+].x=INF;
double ans= INF;
FOR(i,,n+)
if(x>nodes[i-].x && x<nodes[i].x){ //找到起点位置处于i-1...i 然后移动向左|右点
if(i>) ans=min(ans,dp(i-,i-,)+cost(x,nodes[i-].x,-,-));
if(i<=n) ans=min(ans,dp(i,i,)+cost(x,nodes[i].x,-,-));
break;
}
printf("%0.lf\n",floor(ans + sumc));
}
return ;
}

【暑假】[深入动态规划]UVa 10618 Fixing the Great Wall的更多相关文章

  1. 【暑假】[深入动态规划]UVa 10618 Fun Game

    UVa 10618 Fun Game 题目: http://acm.hust.edu.cn/vjudge/problem/viewProblem.action?id=36035 思路:   一圈人围坐 ...

  2. 【暑假】[深入动态规划]UVa 10618 Tango Tango Insurrection

    UVa 10618 Tango Tango Insurrection 题目: Problem A: Tango Tango Insurrection You are attempting to lea ...

  3. 【暑假】[深入动态规划]UVa 10618 The Bookcase

    UVa 12099  The Bookcase 题目: http://acm.hust.edu.cn/vjudge/problem/viewProblem.action?id=42067 思路:    ...

  4. UVa 1336 Fixing the Great Wall (区间DP)

    题意:给定 n 个结点,表示要修复的点,然后机器人每秒以 v 的速度移动,初始位置在 x,然后修复结点时不花费时间,但是如果有的结点暂时没修复, 那么每秒它的费用都会增加 d,修复要花费 c,坐标是 ...

  5. UVA-1336 Fixing the Great Wall(区间DP)

    题目大意:长城(视作x正半轴)有n处破损.有一个智能修复机器人,它的初始位置和移动速度已知.每处破损处都有一组参数(x,c,d),x表示位置,c.d表示在时间t后再修复该处破损的花费为d*t+c.求用 ...

  6. 【杂题总汇】UVa-1336 Fixing the Great Wall

    [UVA-1336]Fixing the Great Wall 一开始把题看错了……直接用的整数存储答案:之后用double存最后输出答案的时候取整就AC了

  7. 【暑假】[深入动态规划]UVa 1628 Pizza Delivery

    UVa 1628 Pizza Delivery 题目: http://acm.hust.edu.cn/vjudge/problem/viewProblem.action?id=51189 思路:    ...

  8. 【暑假】[深入动态规划]UVa 1380 A Scheduling Problem

     UVa 1380 A Scheduling Problem 题目: http://acm.hust.edu.cn/vjudge/problem/viewProblem.action?id=41557 ...

  9. 【暑假】[深入动态规划]UVa 12170 Easy Climb

    UVa 12170 Easy Climb 题目: http://acm.hust.edu.cn/vjudge/problem/viewProblem.action?id=24844 思路:  引别人一 ...

随机推荐

  1. Does not contain a valid host:port authority: Master:8031 (configuration property 'yarn.resourcemanager.resource-tracker.address')

    问题解决: 这个错误是:yarn里面的配置的格式有错误:如: <property> <name>yarn.resourcemanager.address</name> ...

  2. 1.2 XmlBeanFactory的实例化

    源代码分析,是一件既痛苦又快乐的事情,看别人写的代码是通过的,但当你能够看明白的时候,相信快乐也会随之而来,为了减少痛苦,更快的带来快乐, 本文以spring框架的XmlBeanFactory为入手点 ...

  3. Partition an array around an interger

    Partition an array of integers around a value such taht all elements less than x come before element ...

  4. 使用Web代理实现Ajax跨域

    目前的工作项目分为前端和后台,双方事先约定接口,之后独立开发.后台每天开发完后在测试服务器上部署,前端连接测试服务器进行数据交互.前端和后台分开的好处是代码不用混在一个工程里一起build,互不干涉. ...

  5. Unity3d + NGUI 的多分辨率适配(黑边)

    原地址:http://www.2cto.com/kf/201310/250921.html 一.当下移动设备的主流分辨率(数据来自“腾讯分析移动设备屏幕分辨率分析报告”) 1.1 iOS设备的分辨率主 ...

  6. linux fork函数与vfork函数

    一.fork1. 调用方法#include <sys/types.h>#include <unistd.h> pid_t fork(void);正确返回:在父进程中返回子进程的 ...

  7. [Ruby on Rails系列]2、开发环境准备:Ruby on Rails开发环境配置

    前情回顾 上次讲到Vmware虚拟机的安装配置以及Scientific Linux 6.X系统的安装.这回我们的主要任务是在Linux操作系统上完成Ruby on Rails开发环境的配置. 在配置环 ...

  8. 使用eclipse远程调试Tomcat的方法

    tomcat是一种非常常见的java web应用服务器,有时候服务器可能并不是部署在本地,而是部署在远程其他的机器上,我们用eclispe该如何进行debug调试呢? 1. 在eclispe中新建we ...

  9. [模拟]ZOJ3485 Identification Number

    题意:给了一串15位或18位的身份证号码,求 在改变最少位数的情况下, 输出正确合法的身份证号 合法的身份证 是按照以下规则: 前6位以及“Order code”三位  一定合法 其中X是根据前17位 ...

  10. clone函数

    http://blog.csdn.net/caianye/article/details/5947282 http://wenku.baidu.com/link?url=qnq7laYDYm1V8tl ...