天堂
来源:互联网 发布:ad hoc和蜂窝网络 编辑:程序博客网 时间:2024/04/27 14:29
每一个要上天堂的人都要经历一番考验,当然包括小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最少要走的长度。
样例输入
310 4
00 1 2
90
01 1
23 1
01 2
11 2
样例输出
13.00
注释
【样例解释】
在第一层从(0,0)出发到(0,1)取得1个气球并返回(0,0)即可到达第二层。长度:2.00
在第二层,从(0,0)到(0,1)领取气球,再到(1,1)领取气球,两个点来回跑,第5次到达(1,1)时恰好气球数达到10,走到(1,2)即可到达第3层终点。长度:11.00
总长度:13.00
【数据范围】
2<=N<=100
每层的气球店数目不超过50。
0<=M<=100, 0<=Wi<=100
坐标-3000<=x,y<=3000
第i层的气球只能在升入第i+1层时使用,因此层与层之间是互相独立的。
而每层的气球店数目小于50,DP即可,f[i,j]表示已获取i个气球当前在气球店j走的最短长度。很容易得到f[i,j] = f[i-1,k] +Dist(k,j),(k<>j)。
注意细节,
1. 每层的起点和终点是相邻层洞口的位置;
2. 当小X的重量小于气体浮力时,只需走到洞口位置;
3. 多个气球店在同一点时,从此点离开时气球数目可以任意多。
#include<cstdio>#include<cmath>#include<cstring>#include<cstdlib>#include<algorithm>using namespace std;struct node{int x,y;};int n,m,q;int fl[110],num[110];node d[110],mmm[110][110];double f[110][110];void init(){freopen("heaven.in","r",stdin);freopen("heaven.out","w",stdout);}void readdata(){scanf("%d%d%d",&n,&m,&q);for(int i=1;i<n;i++) scanf("%d%d",&d[i].x,&d[i].y);for(int i=1;i<n;i++) scanf("%d",&fl[i]);for(int i=1;i<=q;i++){int x,y,z;scanf("%d%d%d",&x,&y,&z);num[z]++;mmm[z][num[z]].x=x;mmm[z][num[z]].y=y;}}void work(){double ans=0;double x=0,y=0;int s;for(int i=1;i<n;i++){if(fl[i] >= m){ans+=sqrt((d[i].x-x)*(d[i].x-x)+(d[i].y-y)*(d[i].y-y));x=d[i].x;y=d[i].y;continue;}s=m-fl[i];for(int j=1;j<=num[i];j++){f[1][j]=sqrt((mmm[i][j].x-x)*(mmm[i][j].x-x)+(mmm[i][j].y-y)*(mmm[i][j].y-y));//printf("f[1][%d]=%.2lf\n",j,f[1][j]);}for(int j=2;j<=s;j++){for(int k=1;k<=num[i];k++){f[j][k]=999999999;for(int l=1;l<=num[i];l++){if(k!=l){ if(f[j][k] > f[j-1][l]+sqrt((mmm[i][l].x*1.0-mmm[i][k].x*1.0)*(mmm[i][l].x*1.0-mmm[i][k].x*1.0)+(mmm[i][l].y*1.0-mmm[i][k].y*1.0)*(mmm[i][l].y*1.0-mmm[i][k].y*1.0)))f[j][k]=f[j-1][l]+sqrt((mmm[i][l].x*1.0-mmm[i][k].x*1.0)*(mmm[i][l].x*1.0-mmm[i][k].x*1.0)+(mmm[i][l].y*1.0-mmm[i][k].y*1.0)*(mmm[i][l].y*1.0-mmm[i][k].y*1.0));//printf("f[%d][%d]=%.2lf\n",j,k,f[j][k]);}}}}x=d[i].x;y=d[i].y;double minn=999999999;for(int j=1;j<=num[i];j++){if(f[s][j]+sqrt((mmm[i][j].x*1.0-x)*(mmm[i][j].x*1.0-x)+(mmm[i][j].y*1.0-y)*(mmm[i][j].y*1.0-y)) < minn) minn=f[s][j]+sqrt((mmm[i][j].x*1.0-x)*(mmm[i][j].x*1.0-x)+(mmm[i][j].y*1.0-y)*(mmm[i][j].y*1.0-y));}ans+=minn;}printf("%.2lf",ans);}int main(){init();readdata();work();return 0;}
- “天堂?
- 天堂
- 天堂
- 天堂
- 天堂
- 寂寞天堂
- 彩虹天堂
- 天堂电影院
- 心轻上天堂
- IQ天堂
- 天堂电影院
- 天堂avatar
- 彩虹天堂
- 彩虹天堂
- 月若有义寄天堂
- 幸福天堂
- 软件天堂
- 天堂 heaven
- 2013回想一下自己职业生涯的那些事。
- Codeforces Round #207 (Div. 2) Xenia and Hamming(字符串匹配)
- php函数内不能访问函数外的变量原因
- 如何创建基于MFC的COM的Sink接口
- 最新版本dede与discuz通过ucenter完美整合
- 天堂
- Asp.net网站的发布
- VirtualAlloc函数使用总结
- 关于在windows server 2003下用fast-cgi for IIS6.0,配置php5.4的问题
- IOS开发学习-基础篇-推荐使用辅助软件01
- 开源 免费 java CMS - FreeCMS1.5-信息提取
- 图象扭曲算法
- 3阶以下贝塞尔曲线轨迹库和任意轨迹库
- Apriori算法