【动态规划】天堂(Heaven) 解题报告
天堂(heaven)
题目描述
每一个要上天堂的人都要经历一番考验,当然包括小X,小X开始了他进入天堂的奇异之旅。地狱有18层,天堂竟然和地狱一样,也有很多很多层,天堂共有N层。从下到上依次是第1,2,3,…,N层,天堂的每一层都是一个延伸无限远的地板,在地板上人可以任意走动,层与层之间是平行关系,每一层的地板都是由人不能穿过的物质构成,幸好每一层地板上有且仅有1个人可以通过的洞口。
我们可以把小X和洞口,还有下面提到的气球店都看成点,坐标是二维的。小X开始在第1层的(0,0).
小X的重量为M,第i层与第i+1层之间的特殊气体能浮起的重量为Wi ,每一层的地面上散落了若干个气球店,多个气球店可以在同一点,每个气球可以浮起的重量是1,去一个气球店一次只能领取一个气球,不能连续在一个气球店领取气球,当然你可以在两个气球店之间来回跑,每个气球店供应的气球都是无限多的。第i层的气球只能在第i层进入第i+1层时使用,当小X在第i层,只有站到了第i+1层洞口的位置(在其它位置不会浮起),并且自身的重量小于等于气球和特殊气体浮起重量的总和,才可以进入第i+1层。小X想知道他要到达第N层走过的长度最少是多少?题目保证有解。
输入文件
第1行: 三个正整数N,M,Q(Q表示气球店)
第2行: 共2*(N-1)个整数,每两个数描述1个洞口坐标,第i对xi,yi表示第i+1层的洞口位置(xi,yi)。
第3行: 共N-1个整数,第i个数为Wi。
往后Q行,每行三个整数x,y,z , 表示第Z层有一个气球店,坐标为(x,y)
输出文件
1个实数L,保留两位小数,表示小X最少要走的长度。
样例输入
3 10 4
0 0 1 2
9 0
0 1 1
2 3 1
0 1 2
1 1 2
样例输出
13.00
【数据范围】
2<=N<=100
每层的气球店数目不超过50。
0<=M<=100, 0<=Wi<=100
坐标-3000<=x,y<=3000
一开始看上去以为和图论有关,没有意识到是DP,用了搜索,居然还得了30分。但是这题每层的气球只在每一层用,只要想到了用DP,以每一层为单位,分别求出最优解。方程就很好想了,转移方程也不是难点。重点在思维,思维没到什么都是白搭。不多说上代码!
/*
ID: ringxu97
LANG: C++
TASK: heaven
SOLUTION:动态规划
*/
#include<cstdio>
#include<cstring>
#include<iostream>
#include<cmath>
#include<cstdlib>
#include<algorithm>
#include<vector>
using namespace std;
const int MAXM=+,MAXN=+,MAXW=+,MAXQ=+;
const double maxlen=0x7fffffff;//用极大值定义最远的距离
const double err=1e-;
double opt[MAXM][MAXQ];//储存动归状态
//opt[i][j]表示在一层中最买已经买到到i个气体并且在第j个商店时走的最少距离
//状态转移方程为opt[i][j]=min{opt[i-1][k]+distance(k,j) | k!=j}
struct point//定义点的结构体
{
int x,y;//所有点都是整数点
point(){x=y=;}
point(int i,int j){x=i;y=j;}
double dist(point a)//成员函数,用于计算距离
{
return (double)sqrt( (a.x-x)*(a.x-x) + (a.y-y)*(a.y-y));//直接带入公式计算
}
};
vector<point>shop[MAXN];//使用邻接链表储存每一层的商店,节约空间并给商店编号,方便状态转移
point hole[MAXN];//每一层洞口的位置
int W[MAXN];//气体的浮力
int N,M,Q; void readdata()//数据的读入,注意邻接链表的处理
{
scanf("%d%d%d",&N,&M,&Q);
for(int i=;i<N;++i)scanf("%d%d",&hole[i].x,&hole[i].y);
for(int i=;i<N;++i)scanf("%d",W+i);
for(int i=;i<=Q;++i)
{
int x,y,z;
scanf("%d%d%d",&x,&y,&z);
point tmp(x,y);
shop[z].push_back(tmp);
}
}
int main()
{
freopen("heaven.in", "r", stdin);
freopen("heaven.out", "w", stdout);
readdata();
point pos(,);//pos储存当前所在的位置,初始在(0,0)
double d=;//记录已经走过的距离
for(int f=;f<N;++f)//循环计算每一层楼的情况
{
int buy=M-W[f]>?M-W[f]:;//需要购买的气球数量,注意如果浮力大于体重则不需要购买,即购买数量为0
double best=maxlen;//动归过程中储存最优值的变量,初始为无穷大
if(buy)
{
memset(opt,,sizeof(opt));//每一层动归前,初始化数组
int border=shop[f].size();//邻接表的边界
for(int i=;i<border;++i)
opt[][i]=pos.dist(shop[f][i]);//给初始状态赋值
for(int i=;i<=buy;++i)//以下为动归过程
for(int j=;j<border;++j)
{
opt[i][j]=maxlen;
for(int k=;k<border;++k)if(k!=j)//题目中已经规定k不能与j相同
opt[i][j]=min(opt[i-][k]+shop[f][j].dist(shop[f][k]),opt[i][j]);
}
for(int i=;i<border;++i)//动归完成后计算最优方案的值
best=min(best,opt[buy][i]+shop[f][i].dist(hole[f]));
}
else best=pos.dist(hole[f]);//不用买气球的话就直接走到下一层的洞口
d+=best;//累加距离
pos=hole[f];//起点位置变为下一层的洞口处
}
printf("%.2lf\n",d);
return ;//提高AC率的隐藏语句
}
【动态规划】天堂(Heaven) 解题报告的更多相关文章
- [置顶] 刘汝佳《训练指南》动态规划::Beginner (25题)解题报告汇总
本文出自 http://blog.csdn.net/shuangde800 刘汝佳<算法竞赛入门经典-训练指南>的动态规划部分的习题Beginner 打开 这个专题一共有25题,刷完 ...
- 【NOIP2015】提高day2解题报告
题目: P1981跳石头 描述 一年一度的“跳石头”比赛又要开始了!这项比赛将在一条笔直的河道中进行,河道中分布着一些巨大岩石.组委会已经选择好了两块岩石作为比赛起点和终点.在起点和终点之间,有 N ...
- 【第40套模拟题】【noip2011_mayan】解题报告【map】【数论】【dfs】
目录:1.潜伏者 [map] 2.Hankson的趣味题[数论]3.mayan游戏[dfs] 题目: 1. 潜伏者(spy.pas/c/cpp)[问题描述]R 国和S 国正陷入战火之中,双方都互派间谍 ...
- 2011 ACM-ICPC 成都赛区解题报告(转)
2011 ACM-ICPC 成都赛区解题报告 首先对F题出了陈题表示万分抱歉,我们都没注意到在2009哈尔滨赛区曾出过一模一样的题.其他的话,这套题还是非常不错的,除C之外的9道题都有队伍AC,最终冠 ...
- ZOJ 1093 Monkey and Banana (LIS)解题报告
ZOJ 1093 Monkey and Banana (LIS)解题报告 题目链接:http://acm.hust.edu.cn/vjudge/contest/view.action?cid= ...
- 【原创】leetCodeOj --- Sliding Window Maximum 解题报告
天,这题我已经没有底气高呼“水”了... 题目的地址: https://leetcode.com/problems/sliding-window-maximum/ 题目内容: Given an arr ...
- poj1173 解题报告
poj1173 解题报告2013-07-21 13:31 by 期待 ., 42 阅读, 0 评论, 收藏, 编辑 http://poj.org/problem?id=1173 发现此题资料甚少,斗胆 ...
- [NOIP2013 花匠] 新人解题报告
本来按照老师的要求,我学OI的第一份解题报告应是在寒假完成的关于数据结构的基础题,但由于身体原因当时未能完成,那么就在省选赛前临时写几篇吧…… 题目描述 花匠栋栋种了一排花,每株花都有自己的高度.花儿 ...
- Leetcode 115 Distinct Subsequences 解题报告
Distinct Subsequences Total Accepted: 38466 Total Submissions: 143567My Submissions Question Solutio ...
随机推荐
- Object-C添加方法
给实例变量添加getter方法: #import <Cocoa/Cocoa.h> @interface Photo:NSObject { NSString *caption; NSStri ...
- 回退符\b
回退符\b #include <stdio.h> int main(){ printf("hello\b"); getchar(); getchar(); ; } 实验 ...
- Object layout in C++ and access control
The variables are guaranteed to be laid out contiguously, as in C. However, the access blocks may no ...
- [转] CSS3混合模式mix-blend-mode/background-blend-mode简介 ---张鑫旭
by zhangxinxu from http://www.zhangxinxu.com本文地址:http://www.zhangxinxu.com/wordpress/?p=4819 一.关于混合模 ...
- php脚本业务逻辑
设置时区 设置执行不超时 设置根目录常量 引入配置文件(自定义/模板) 错误记录 定义业务类 执行业务类::run() 数据库单例初始化(连接) 日志单例初始化(引入日志类,配置日志路径,日志开关) ...
- UML2.0统一建模语言
Unified Modeling Language (UML)又称统一建模语言或标准建模语言,是支持模型化和软件系统开发的图形化语言,为软件开发的所有阶段提供模型化和可视化支持,包括由需求分析到规 ...
- Visual c++ 2012 软件错误
vs2012 未能正确加载"Visual C++ Language Manager Package"包 解决办法 如下图所示: 到官网下载更新即可. http://www.micr ...
- eclipse/myeclipse选中编辑区域文件,Package Explorer定位文件所在项目及目录
eclipse/myeclipse选中编辑区域文件,Package Explorer定位文件所在项目及目录 1. 打开Package Explorer(若没有,可以按照如下路径点击: Window菜单 ...
- C#反射(一) 【转】
在还不太熟悉反射的昨天,以为反射很神秘,在网上到处找答案.今天找了段代码敲了一下,茅塞顿开!其实反射也就那么简单的一回事! 反射是一种机制,通过这种机制我们可以知道一个未知类型的类型信息.比如, ...
- matlab在图片上画框
matlab在图片上画框 之前写过一个MATLAB在图片上画框的代码, http://blog.csdn.net/carson2005/article/details/17262811 最近使用后发现 ...