POJ 1661 Help Jimmy
2016-06-22 10:59
281 查看
点击打开链接
#include <iostream>
#include <algorithm>
using namespace std;
const int M =21000;
const int Inf=1<<30;
typedef struct{
int X;
int Y;
int H;
}Node;
Node node[M];
int n;
bool operator<(const Node a,const Node b)
{
return a.H>b.H;
}
int main()
{
int t;
cin>>t;
while(t--)
{
int x,y,MAX;
cin>>n>>x>>y>>MAX;
int R[M],L[M];// R[i] 从i号平台右端下落到地面的最短时间
node[0].X=node[0].Y=x;
node[0].H=y; // 初始位置
for(int i=1;i<=n;i++)
{
cin>>node[i].X>>node[i].Y>>node[i].H;
}
sort(node,node+n+1);
for(int i=n;i>=0;i--) // 逆推
{
int j;
for(j=i+1;j<=n;j++) // 找 i的左端点下发有plant吗
{
if(node[i].X>=node[j].X&&node[i].X<=node[j].Y)
{
break;
}
}
if(j>n)
{
if(node[i].H>MAX)
{
L[i]=Inf;
}
else
L[i]=node[i].H;
}
else
{
int k=node[i].H-node[j].H;
if(k>MAX) L[i]=Inf;
else
L[i]=min(node[i].X-node[j].X+L[j],node[j].Y-node[i].X+R[j])+k; // dp到J后选择方向
}
for(j=i+1;j<=n;j++) // 找 i的右端点下发有plant吗
{
if(node[i].Y>=node[j].X&&node[i].Y<=node[j].Y)
{
break;
}
}
if(j>n)
{
if(node[i].H>MAX)
{
R[i]=Inf;
}
else
R[i]=node[i].H;
}
else
{
int k=node[i].H-node[j].H;
if(k>MAX) //
R[i]=Inf;
else
R[i]=min(node[i].Y-node[j].X+L[j],node[j].Y-node[i].Y+R[j])+k; // dp:到J后选择方向
}
}
int ans=min(L[0],R[0]);
cout<<ans<<endl;
}
return 0;
}
#include <iostream>
#include <algorithm>
using namespace std;
const int M =21000;
const int Inf=1<<30;
typedef struct{
int X;
int Y;
int H;
}Node;
Node node[M];
int n;
bool operator<(const Node a,const Node b)
{
return a.H>b.H;
}
int main()
{
int t;
cin>>t;
while(t--)
{
int x,y,MAX;
cin>>n>>x>>y>>MAX;
int R[M],L[M];// R[i] 从i号平台右端下落到地面的最短时间
node[0].X=node[0].Y=x;
node[0].H=y; // 初始位置
for(int i=1;i<=n;i++)
{
cin>>node[i].X>>node[i].Y>>node[i].H;
}
sort(node,node+n+1);
for(int i=n;i>=0;i--) // 逆推
{
int j;
for(j=i+1;j<=n;j++) // 找 i的左端点下发有plant吗
{
if(node[i].X>=node[j].X&&node[i].X<=node[j].Y)
{
break;
}
}
if(j>n)
{
if(node[i].H>MAX)
{
L[i]=Inf;
}
else
L[i]=node[i].H;
}
else
{
int k=node[i].H-node[j].H;
if(k>MAX) L[i]=Inf;
else
L[i]=min(node[i].X-node[j].X+L[j],node[j].Y-node[i].X+R[j])+k; // dp到J后选择方向
}
for(j=i+1;j<=n;j++) // 找 i的右端点下发有plant吗
{
if(node[i].Y>=node[j].X&&node[i].Y<=node[j].Y)
{
break;
}
}
if(j>n)
{
if(node[i].H>MAX)
{
R[i]=Inf;
}
else
R[i]=node[i].H;
}
else
{
int k=node[i].H-node[j].H;
if(k>MAX) //
R[i]=Inf;
else
R[i]=min(node[i].Y-node[j].X+L[j],node[j].Y-node[i].Y+R[j])+k; // dp:到J后选择方向
}
}
int ans=min(L[0],R[0]);
cout<<ans<<endl;
}
return 0;
}
相关文章推荐
- c3p0连接配置
- kmp单片自动机
- iOS 开发之Target-action模式
- Oracle查看耗资源SQL
- swift Alamofire+ObjectMapper——swift(学习九)
- ECSHOP通过改变模板路径制作手机站
- Tachyon源码结构分析(四)
- ROS下使用摄像头
- win7 solr6.1.0+jdk1.8
- *p++/(*p)++/*(p++)的区别
- Linux 调优方案, 修改最大连接数(ulimit命令)
- 编译安装nginx
- C语言动态库的使用
- matlab连续读取多幅图像
- Redhat7.2配置免费yum源(简单五步轻松搞定)
- Android Studio中如何打JAR包
- Tachyon源码结构分析(三)
- Xcode 环境变量
- 如何定义XSD并在XML中使用XSD
- redis常用操作总结