小黑的镇魂曲(HDU2155:贪心+dfs+奇葩解法)
题目:点这里
题目的意思跟所谓的是英雄就下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+奇葩解法)的更多相关文章
- hdu2155 小黑的镇魂曲(dp)
题意: 小黑的镇魂曲 Problem Description 这个事情发生在某一天,当小黑和SSJ正在约会的时候,邪恶的Guner抓走了SSJ, ...
- 【bzoj3252】攻略 贪心+DFS序+线段树
题目描述 题目简述:树版[k取方格数] 众所周知,桂木桂马是攻略之神,开启攻略之神模式后,他可以同时攻略k部游戏. 今天他得到了一款新游戏<XX半岛>,这款游戏有n个场景(scene),某 ...
- hdu6060[贪心+dfs] 2017多校3
/* hdu6060[贪心+dfs] 2017多校3*/ #include <bits/stdc++.h> using namespace std; typedef long long L ...
- UVALive3902 Network[贪心 DFS&&BFS]
UVALive - 3902 Network Consider a tree network with n nodes where the internal nodes correspond to s ...
- GPS围栏两个多边形相交问题的奇葩解法
前言 GPS测量仪测量的产地面积,然后提交到系统中,系统需要校验这块产地和其他产地是否有重叠,重叠超过10%就要提出警告这块产地已经被XXX登记入库了.GPS测量仪测量出来的数据是连续的经纬度坐标数据 ...
- hdu4915 Parenthese sequence 贪心O(n)解法(new)
hdu4915 Parenthese sequence Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 131072/131072 K ...
- 【NOIP2003】传染病控制(-贪心/dfs)
我自己yy了个贪心算法,在某oj 0msAC~.然后去wikioi提交,呵呵,原来是之前oj的数据太弱给我水过了,我晕. 我之前的想法是在这棵树上维护sum,然后按时间来割边,每一时刻割已经感染的人所 ...
- HDU 5802 Windows 10 (贪心+dfs)
Windows 10 题目链接: http://acm.hdu.edu.cn/showproblem.php?pid=5802 Description Long long ago, there was ...
- hdoj1242(dfs 剪枝 解法)
题意:拯救行动,天使r有多个朋友a(friends,在这里被坑了几次,没看清题意),天使被关在牢房里,等着朋友来拯救,求拯救天使的最短距离. 解法:如果不剪枝,200*200的地图会超时,可以以天使为 ...
随机推荐
- C#实现注销、重启和关机代码
首先要导入对命名空间 using System.Runtime.InteropServices; 的引用 [StructLayout(LayoutKind.Sequential, Pack = 1)] ...
- 实时数据采集传输软件LDM配置
本环境一共两个机器:cma.ldm87.gov.cn(hostname)机器作为upstream LDM,cma.ldm84.gov.cn(hostname)机器作为downstream LDM.下面 ...
- ext_EditorGridPanel (8)
EditorGridPanel ExtJS 中的可编辑表格由类Ext.grid.EditorGridPanel 表示,xtype 为editorgrid,和gridPanel的区别就是,这个表格中的内 ...
- hdu 4099 Revenge of Fibonacci 字典树+大数
将斐波那契的前100000个,每个的前40位都插入到字典树里(其他位数删掉),然后直接查询字典树就行. 此题坑点在于 1.字典树的深度不能太大,事实上,超过40在hdu就会MLE…… 2.若大数加法时 ...
- [AngularJS] ngCloak
The ngCloak directive is used to prevent the Angular html template from being briefly displayed by t ...
- du 和 df命令的区别(超赞)
du和df命令都被用于获得文件系统大小的信息:df用于报告文件系统的总块数及剩余块数,du -s /<filesystem>用于报告文件系统使用的块数.但是,我们可以发现从df命令算出的文 ...
- [Effective C++ --030]透彻了解inlining的里里外外
引言 inline函数 在函数声明或定义中函数返回类型前加上关键字inline即把min()指定为内联. inline函数对编译器而言必须是可见的,以便它能够在调用点内展开该函数.与非inline函 ...
- wpf linq数据库无法插入
最近做wpf应用程序,遇到一个很奇怪的问题,我用代码往数据库里插入数据成功了,但去vs的服务器资源管理器里查看数据库总是最开始的样子,什么都没有插入进去,然后就检查代码,打日志查看sql语句,发现都没 ...
- 琐碎-同步centos集群的时间
想马上上手HBase,其对集群时间同步要求很高,当然,hadoop也是
- Last non-zero Digit in N!
Problem Description The expression N!, read as "N factorial," denotes the product of the f ...