截柱子

来源:互联网 发布:harris角点检测算法 编辑:程序博客网 时间:2024/04/26 20:23

题目描述

有n根柱子竖在地面上排成一排,每根柱子都可以从顶端截下一段以此来调整为任意高度,但是,柱子被截后剩下的高度必须是大于等于1的整数。相邻两根柱子的距离为w。现在要用一条绳子从第一根柱子的端点按顺序经过每一根柱子的端点到达最后一根绳子的端点,求这根绳子最长需要用多长?

输入格式

第一行输入一个数T,表示测试数据个数,对于每个测试数据,第一行输入两个整数n,w,分别表示柱子个数和相邻两根柱子的距离,第二行输入n个整数,分别表示每根柱子的初始高度
数据范围:
0<n<=100
0<w<=10
0<每根柱子的初始高度<=100

输出

对于每个测试数据,输出一个数,表示绳子最长需要多长,答案保留3位小数。

样例输入

2
3 2
3 3 3
4 10
1 1 1 1

样例输出

5.657

30.000

//1780 kb 0 ms#include <cstdio>#include <iostream>#include <cstring>#include <cmath>#include <algorithm>using namespace std;int h[105];double dp[105][105];inline double dis(int x, int y){    return sqrt(x*x + y*y);}int main(){    int T; scanf("%d", &T);    while(T--){        int n, w;        scanf("%d%d", &n, &w);        for(int i=0; i<n; i++)            scanf("%d", &h[i]);        memset(dp, 0, sizeof(dp));        for(int i=1; i<=n-1; i++){            for(int j=1; j<=h[i]; j++){                for(int k=1; k<=h[i-1]; k++){                    dp[i][j] = max(dp[i][j], dp[i-1][k] + dis(j-k, w));                }            }        }        double res = 0;        for(int j=1; j<=h[n-1]; j++){            if(dp[n-1][j] > res) res = dp[n-1][j];        }        printf("%.3lf\n", res);    }    return 0;}


0 0
原创粉丝点击