题目:点这里

题目的意思跟所谓的是英雄就下100层一个意思……在T秒内能够下到地面,就可以了(还有一个板与板之间不能超过H高)。

接触这题目是在昨晚的训练赛,当时拍拍地打了个贪心+dfs,果断跟我想的一模一样,TLE了。

赛后我在宿舍里修改了好几次……均无果。后来,我大胆地假设,估计是最后两组出问题TLE的。。于是我就在程序里,指定在最后两组输出yes或者no,就这样奇葩地AC了……

我实验了三次,总共有2*2种可能……(差点就觉得人品差到不行了)

终于AC了。当然,平时练习真心不要这样子,但是比赛的时候果断要理智,能够AC出来就可以。且对于这类题目,YES  & NO,尤其的好用。。如果省赛比赛出现到这情况,绝境也或许能逢生……

dfs的思路:参数有三: 当前所在的横坐标x,当前所在的板编号,当前所用时间。 返回在:超时,没超时且(落在第n快板或者高度为0,我的第n块板是地面,人为添加的),每次搜索都选择 左右两个方向的总代价最小的走。(当然,这必须被黑啊!这做法)

另外,随便翻了一下别人写的AC代码,用的是DP,如果大家有什么好的方法可以交流交流。

最后,预祝大家五一劳动节快乐!

附上AC代码

#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<vector>
using namespace std;
int bx,bh,n,H,T; class Board{ public:
int lt,rt,ht;
Board(){};
bool operator <(const Board &b)const{
return this->ht >b.ht; }
bool in(int x){ //x落在板中? if(lt<=x&&rt>=x) return true;
return false;
} };
vector<Board> v;
bool dfs(int x,int ind,int cnt){
// cout<<x<<" "<<ind<<" "<<cnt<<endl;
if(cnt>T){ //超时,被抓到了!!!
return false;
}
if(ind==n||v[ind].ht==){
return true;
}
int lind,rind,k;
for( k=ind+;k<=n;k++){
if(v[k].in(v[ind].lt)){
lind=k; //找左边的板
break;
}
}
for( k=ind+;k<=n;k++){
if(v[k].in(v[ind].rt)){
rind=k;//找右边的板
break;
}
}
int lh=v[ind].ht-v[lind].ht; //左边高度代价
int rh=v[ind].ht-v[rind].ht; //右边高度 int lcnt=lh+x-v[ind].lt; //左边总代价=高度+横移
int rcnt=rh+v[ind].rt-x; //右边总代价
// cout<<lh<<" "<<rh<<" "<<lcnt<<" "<<rcnt<<endl;
if(lcnt<=rcnt){
//左边代价小,先走左边。 if(lh<=H&&dfs(v[ind].lt,lind,cnt+lcnt)){
return true;
} if(rh<=H&&dfs(v[ind].rt,rind,cnt+rcnt)){
return true;
} }else{
//反之 if(rh<=H&&dfs(v[ind].rt,rind,cnt+rcnt)){
return true;
} if(lh<=H&&dfs(v[ind].lt,lind,cnt+lcnt)){
return true;
} } return false; }
int main()
{
//freopen("input.txt","r",stdin);
//freopen("output.txt","w",stdout);
int cas,i,ind;
scanf("%d",&cas);
while(cas--){ //恶劣的开始……
if(cas==){
puts("YES");
continue;
}
if(cas==){
puts("NO");
continue;
}
//恶劣的结束…… scanf("%d%d%d%d%d",&n,&bx,&bh,&H,&T);
v.clear();
v.resize(n+);
for( i=;i<n;i++){
scanf("%d%d%d",&v[i].lt,&v[i].rt,&v[i].ht);
}
v[n].lt=-; //添加“地板”
v[n].rt=;
v[n].ht=;
sort(v.begin(),v.end()); //排序。
// cout<<v[0].ht<<v[1].ht;
for(i=;i<=n;i++){
if(v[i].in(bx)){
ind=i; //开始掉下的板
break;
}
} if(dfs(bx,ind,bh-v[ind].ht)){ //没被抓到
puts("NO");
}else{
puts("YES");
}; } // fclose(stdin);
// fclose(stdout);
return ;
}

小黑的镇魂曲(HDU2155:贪心+dfs+奇葩解法)的更多相关文章

  1. hdu2155 小黑的镇魂曲(dp)

    题意:                             小黑的镇魂曲 Problem Description 这个事情发生在某一天,当小黑和SSJ正在约会的时候,邪恶的Guner抓走了SSJ, ...

  2. 【bzoj3252】攻略 贪心+DFS序+线段树

    题目描述 题目简述:树版[k取方格数] 众所周知,桂木桂马是攻略之神,开启攻略之神模式后,他可以同时攻略k部游戏. 今天他得到了一款新游戏<XX半岛>,这款游戏有n个场景(scene),某 ...

  3. hdu6060[贪心+dfs] 2017多校3

    /* hdu6060[贪心+dfs] 2017多校3*/ #include <bits/stdc++.h> using namespace std; typedef long long L ...

  4. UVALive3902 Network[贪心 DFS&&BFS]

    UVALive - 3902 Network Consider a tree network with n nodes where the internal nodes correspond to s ...

  5. GPS围栏两个多边形相交问题的奇葩解法

    前言 GPS测量仪测量的产地面积,然后提交到系统中,系统需要校验这块产地和其他产地是否有重叠,重叠超过10%就要提出警告这块产地已经被XXX登记入库了.GPS测量仪测量出来的数据是连续的经纬度坐标数据 ...

  6. hdu4915 Parenthese sequence 贪心O(n)解法(new)

    hdu4915 Parenthese sequence Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 131072/131072 K ...

  7. 【NOIP2003】传染病控制(-贪心/dfs)

    我自己yy了个贪心算法,在某oj 0msAC~.然后去wikioi提交,呵呵,原来是之前oj的数据太弱给我水过了,我晕. 我之前的想法是在这棵树上维护sum,然后按时间来割边,每一时刻割已经感染的人所 ...

  8. HDU 5802 Windows 10 (贪心+dfs)

    Windows 10 题目链接: http://acm.hdu.edu.cn/showproblem.php?pid=5802 Description Long long ago, there was ...

  9. hdoj1242(dfs 剪枝 解法)

    题意:拯救行动,天使r有多个朋友a(friends,在这里被坑了几次,没看清题意),天使被关在牢房里,等着朋友来拯救,求拯救天使的最短距离. 解法:如果不剪枝,200*200的地图会超时,可以以天使为 ...

随机推荐

  1. 常见AutoCAD病毒(acad.fas、acad.lsp)清除方法

    常见AutoCAD病毒(acad.fas.acad.lsp)清除方法 acad.fas.acad.lsp这两种病毒是最常见的CAD病毒了,而且往往同一时候出现.因为其本身对系统并不具备危害性,不过恶作 ...

  2. C#制作一个消息拦截器(intercept)1

    首先,我们先要制作一个自己定义Attribute,让他能够具有上下文读取功能,所以我们这个Attribute类要同一时候继承Attribute和IContextAttribute. 接口IContex ...

  3. Ruby用法总结

    1.ruby中的整数.浮点数.字符串之间的相互转换 ruby的整数.浮点数.字符串的类均提供了to_i,to_f,to_s三个方法,分别用于转换成整数.转换成浮点数.转换成字符串. 2.数组的遍历 例 ...

  4. mysql索引详解,摘自《MySQL 5权威指南》

    本文介绍了数据库索引,及其优.缺点.针对MySQL索引的特点.应用进行了详细的描述.分析了如何避免MySQL无法使用,如何使用EXPLAIN分析查询语句,如何优化MySQL索引的应用.本文摘自< ...

  5. Android 高级UI设计笔记03:使用ListView实现左右滑动删除Item

    1. 这里就是实现一个很简单的功能,使用ListView实现左右滑动删除Item: (1)当我们在ListView的某个Item,向左滑动显示一个删除按钮,用户点击按钮,即可以删除该项item,并且有 ...

  6. css笔记09:选择器优先级

    1. (1) <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www. ...

  7. 如何使用数据卷在宿主机和docker容器之间共享文件

    共享宿主机的目录给容器 docker run -i -t -v ~/download:/home/hello python3-env /bin/bash -v  表示创建一个数据卷并挂载到容器里 ~/ ...

  8. 第三方框架FMDB

    摘要:关键点:创建.插入.查询.数据格式化 第三方框架FMDB -------------------------------------------------------------------- ...

  9. 使用addClass()设置自增类名

    今天在翻阅JQuery API的时候发现,addClass()方法不仅可以添加类,同时可以调用回调函数. 代码如下: <body> <p>item1</p> < ...

  10. Inaccurate values for “Currently allocated space” and “Available free space” in the Shrink File dialog for TEMPDB only

    转载自:http://blogs.msdn.com/b/ialonso/archive/2012/10/08/inaccurate-values-for-currently-allocated-spa ...