题意:

                            小黑的镇魂曲

Problem Description

这个事情发生在某一天,当小黑和SSJ正在约会的时候,邪恶的Guner抓走了SSJ,小黑伤心万分,怒不可遏啊!但是他显然也是没有办法的,谁叫Guner比小黑邪恶,小黑打不过Guner呢!于是,小黑利用皮肤保护色,趁夜摸黑前往Guner的城堡,准备偷偷摸摸的把SSJ拯救出来,但是只要小黑一打开SSJ身上的锁链,看门的葱头就会在M秒以内通知Guner,Guner马上超时空转移,闪到小黑身边抓住他们,于是小黑虽然跑得不快,但是他也不得不跑啊。由于Guner的城堡构造特殊,它是由一个一个的平台搭建成的,所以小黑的逃跑路线是这样

的,在时刻0的时候,他位于最高点,也就是高于所有的平台,然后他开始垂直下落,他的下落速度是1米/秒。当小黑下落到某个平台上时,他可以向左跑也可以向右跑,他的跑动速度还是1米/秒。当小黑又处于平台边缘的时候,他开始继续下落。但是小黑是个怜香惜玉的人,为了顾及怀中的SSJ,于是他每次下落的最大高度不会超过MAX米,不然SSJ摔坏了,Guner也懒得追了,小黑也会伤心致死的。但是只要小黑抱着SSJ一落到地面,Guner就再也抓不住他们了。

Input

第一行输入一个数T(0 < T <= 10),表示测试数据的组数。每组测试数据的第一行是5个整数,N,X,Y,MAX,M,用空格分开。N(0 < N <= 1000)是台阶的数目,X,Y分别是小黑0时刻所在位置的横、纵坐标,MAX表示小黑最多能下落的高度,M表示从小黑一打开锁链葱头发觉后报告给Guner的时间,接下来有N行数据,每行数据描述一个台阶,包括3个数据,Xl[i],Xr[i],H[i],其中Xl[i](0 < Xl[i] <= 1000)表示当前台阶最左边的边的X坐标,Xr[i](0 < Xr[i]
<= 1000)表示当前台阶最右边的边的X坐标,H[i](0 < H[i] < 1000)表示当前台阶

离地面的高度。数据确保小黑和SSJ是能到达地面的。

 

Output

每组测试数据当Guner能抓住小黑和SSJ时,输出YES,否则输出NO.

 

Sample Input

1

1 10 17 20 20

1 8 7

 

Sample Output

NO

思路:

      哎!这个题目敲了60多遍,有点伤心了,当时想的是用最短路,因为是1000*1000的坐标,最多也就是1000*1000那么多的点,然后是边,边也没有多少,估计大约600多万,建边的话,对于每一个下降,我都建3条边,当前点到下落点,下落点到下落边的左端点,下落点到下落边的右端点(注意一个点下落最多降落在一条边上,因为无法传过边),把能下落的点都mark上,最后在吧所有没mark并且能到达地面的和地面连接一条边,跑起点到地面的最短路,结果wa了好多次,后来wa的我自己都蒙了,以为是什么重边啊什么的(蒙圈了),最后用的dp过的,哎!真心不明白自己的最短路那个地方错了,这个题目要是用dp还是很同一弄的,和刚接触dp时的那个数塔差不多,对于每一条边,我们用他的做端点(和右端点)更新下面的可达边的左右端点的最优值,dp[i][0]表示的是第i条边的做端点的最优,dp[i][1]表示的是i条边右端点的最优,然后就往下更新就行了,记住一点就是一个点下落对多只能降落到一条边上,所以先sort下,然后第一次降落之后就break,具体看代码吧。


#include<stdio.h>
#include<string.h>
#include<algorithm> #define N 1100
#define INF 1000000000

using namespace
std; typedef struct
{
int
l ,r ,h;
}
NODE; NODE node[N];
int
dp[N][2]; bool camp(NODE a ,NODE b)
{
return
a.h > b.h;
} int
minn(int x ,int y)
{
return
x < y ? x : y;
} bool
solve(int n ,int maxx ,int t)
{
for(int
i = 1 ;i <= n ;i ++)
dp[i][0] = dp[i][1] = INF;
dp[1][0] = dp[1][1] = 0;
sort(node + 1 ,node + n + 1 ,camp);
for(int
i = 1 ;i <= n ;i ++)
{
for(int
j = i + 1 ;j <= n ;j ++)
{
if(
node[i].h - node[j].h > maxx) break;
if(
node[i].l >= node[j].l && node[i].l <= node[j].r)
{
if(
j == n)
{

dp[j][0] = minn(dp[j][0] ,dp[i][0] + node[i].h);
dp[j][1] = minn(dp[j][1] ,dp[i][0] + node[i].h);
}
else
{

dp[j][0] = minn(dp[j][0] ,dp[i][0] + (node[i].h - node[j].h) + (node[i].l - node[j].l));
dp[j][1] = minn(dp[j][1] ,dp[i][0] + (node[i].h - node[j].h) + (node[j].r - node[i].l));
}
break;
}
} for(int
j = i + 1 ;j <= n ;j ++)
{
if(
node[i].h - node[j].h > maxx) break;
if(
node[i].r >= node[j].l && node[i].r <= node[j].r)
{
if(
j == n)
{

dp[j][0] = minn(dp[j][0] ,dp[i][1] + node[i].h);
dp[j][1] = minn(dp[j][1] ,dp[i][1] + node[i].h);
}
else
{

dp[j][0] = minn(dp[j][0] ,dp[i][1] + (node[i].h - node[j].h) + (node[i].r - node[j].l));
dp[j][1] = minn(dp[j][1] ,dp[i][1] + (node[i].h - node[j].h) + (node[j].r - node[i].r));
}
break;
}
}
}
return
dp[n][0] <= t || dp[n][1] <= t;
} int main ()
{
int
n ,x ,y ,max ,t ,T ,i;
scanf("%d" ,&T);
while(
T--)
{

scanf("%d %d %d %d %d" ,&n ,&x ,&y ,&max ,&t);
node[1].l = node[1].r = x ,node[1].h = y;
for(
i = 1 ;i <= n ;i ++)
scanf("%d %d %d" ,&node[i+1].l ,&node[i+1].r ,&node[i+1].h);
n += 2;
node[n].l = 0 ,node[n].r = 1001 ,node[n].h = 0;
if(
solve(n ,max ,t)) printf("NO\n");
else
printf("YES\n");
}
return
0;
}

 

hdu2155 小黑的镇魂曲(dp)的更多相关文章

  1. hdu 2155 小黑的镇魂曲(dp) 2008信息工程学院集训队——选拔赛

    感觉蛮坑的一道题. 题意很像一个叫“是男人下100层”的游戏.不过多了个时间限制,要求在限定时间内从某一点下落到地面.还多了个最大下落高度,一次最多下落这么高,要不然会摔死. 一开始想dp的,然后想了 ...

  2. 小黑的镇魂曲(HDU2155:贪心+dfs+奇葩解法)

    题目:点这里 题目的意思跟所谓的是英雄就下100层一个意思……在T秒内能够下到地面,就可以了(还有一个板与板之间不能超过H高). 接触这题目是在昨晚的训练赛,当时拍拍地打了个贪心+dfs,果断跟我想的 ...

  3. 【HDOJ】2155 小黑的镇魂曲

    线段树+SPFA最短路可以过.或者DP也能过.需要注意的是xl的范围是错的,测试用例中xl可能为0,他妈的,因为这个一直莫名其妙的wa.1. spfa建图增加一倍的点即可(讨论左端点和右端点). /* ...

  4. [kuangbin带你飞]专题二十二 区间DP

            ID Origin Title   17 / 60 Problem A ZOJ 3537 Cake   54 / 105 Problem B LightOJ 1422 Hallowee ...

  5. HDU 4283 You Are the One (12年天津 区间DP)

    题意:有一个队列,每个人有一个愤怒值a[i],如果他是第k个上场,不开心指数就为(k-1)*a[i].但是边上有一个小黑屋(其实就是个堆栈),可以一定程度上调整上场程序 思路:枚举区间和每个人第几个上 ...

  6. HDU4283:You Are the One(区间DP)

    Problem Description The TV shows such as You Are the One has been very popular. In order to meet the ...

  7. hdu4283(区间dp)

    题目连接:http://acm.hdu.edu.cn/showproblem.php?pid=4283 题意:有一个队列,每个人有一个愤怒值D,如果他是第K个上场,不开心指数就为(K-1)*D.但是边 ...

  8. hdu_4283_You Are the One(区间DP)

    题目链接:hdu_4283_You Are the One 题意: 有n个人,每个人有个屌丝值,如果果他是第K个上场,不开心指数就为(K-1)*D,然后有个小黑屋,可以调整他们的出场顺序,现在让你调整 ...

  9. hdu 4283"You Are the One"(区间DP)

    传送门 https://www.cnblogs.com/violet-acmer/p/9852294.html 题意: 有n个屌丝排成一排,每个屌丝都有一个不开心值a[ i ]( i=1,2,3,.. ...

随机推荐

  1. shell脚本,mysql数据库的备份-2[mysqldump]

    # 数据库IPIP=127.0.0.1# 数据库端口PORT=3306# 数据库用户USER=root# 数据库密码PASSWORD=****# 要备份的数据库TARGET_DB=database_n ...

  2. vue 折线柱状图

    需求:折线柱状图实现,显示不同提示,颜色,标记等等. 图例: 实现: <template> <div class="transaction-barline"> ...

  3. slickgrid ( nsunleo-slickgrid ) 5 增加子件

    slickgrid ( nsunleo-slickgrid ) 5 增加子件 上次把单元格切换的问题解决了,这次要最做的事情就是给slickgrid的treegird增加子件,我们先选中某一条记录,然 ...

  4. P1308_统计单词数(JAVA语言)

    题目描述 一般的文本编辑器都有查找单词的功能,该功能可以快速定位特定单词在文章中的位置,有的还能统计出特定单词在文章中出现的次数. 现在,请你编程实现这一功能,具体要求是:给定一个单词,请你输出它在给 ...

  5. [源码解析] 并行分布式框架 Celery 之架构 (2)

    [源码解析] 并行分布式框架 Celery 之架构 (2) 目录 [源码解析] 并行分布式框架 Celery 之架构 (2) 0x00 摘要 0x01 上文回顾 0x02 worker的思考 2.1 ...

  6. linux程序开机自动启动

    linux如果需要实现开机启动, 可以找到 $HOME/.config/autostart 目录(没有的话新建一个),在该文件夹下创建一个空文件,文件名自拟,后缀必须是desktop,如:dingda ...

  7. 解Bug之路-主从切换"未成功"?

    解Bug之路-主从切换"未成功"? 前言 数据库主从切换是个非常有意思的话题.能够稳定的处理主从切换是保证业务连续性的必要条件.今天笔者就来讲讲主从切换过程中一个小小的问题. 故障 ...

  8. Spring Boot 轻量替代框架 Solon 1.3.18 发布

    Solon 是一个微型的Java开发框架.项目从2018年启动以来,参考过大量前人作品:历时两年,4000多次的commit:内核保持0.1m的身材,超高的跑分,良好的使用体验.支持:RPC.REST ...

  9. SpringBoot-11 扩展功能

    SpringBoot-11 扩展功能 异步 同步就是一个任务的完成需要依赖另外一个任务时,只有等待被依赖的任务完成后,依赖的任务才能算完成,这是一种可靠的任务序列.要么成功都成功,失败都失败,两个任务 ...

  10. 加快Python运行速度

    01 使用哈希表的数据结构 如果在程序中遇到大量搜索操作时,并且数据中没有重复项,则可以使用查找而不是循环.举例如下: items = ['a', 'b',..,'100m'] #1000s of i ...