列表

详情


NC25187. 蜗牛

描述

“我要一步一步往上爬,在最高点乘着叶片往前飞,
任风吹干流过的泪和汗。


我要一步一步往上爬,等待阳光静静看着它的脸,
小小的天有大大的梦想,


总有一天我有属于我的天。

zjq 很喜欢周董的这首《蜗牛》,他时常想象自己也是这样一只小小的蜗牛,想要一步一步地往上爬。然而蜗生的道路是曲折的,小蜗牛经常会迷失自己的方向。

小蜗牛现在又来到了一个新的起点,它现在在楼梯的左下角,它想要爬到楼梯的右上角,去追寻自己的梦想,你能告诉小蜗牛,爬到楼梯右上角的最短路径多长吗?如果你能帮助小蜗牛走上蜗生巅峰,小蜗牛将会送你一个气球作为回报。

(小蜗牛会分泌一种粘液,它可以在竖直的面上爬,当然也可以在楼梯的侧面上

爬,但是小蜗牛毕竟是小蜗牛,它不是穿山甲,因此它不能走楼梯的下面和后面。)

小蜗牛的位置和终点的位置如图所示。楼梯一共有 n 节,楼梯是均匀的,每节楼梯的高度为 a,深度为 b,宽度为 c




输入描述

输入的第一行为一个整数T,T≤100,表示数据的组数。

接下来T行,每行有四个整数n,a,b,c,0<n,a,b,c≤100,分别表示楼梯的节数、高度、深度和宽度。

输出描述

对于每组样例,输出一个小数,输出的结果与答案的相对误差在0.001以内则认为是正确的。

示例1

输入:

2
3 12 13 82
5 3 3 52

输出:

111.1260545507 
60.0333240792 

原站题解

上次编辑到这里,代码来自缓存 点击恢复默认模板

C++14(g++5.4) 解法, 执行用时: 3ms, 内存消耗: 476K, 提交时间: 2019-04-24 21:18:32

#include<stdio.h>
#include<math.h>
#include<iostream>
#include<algorithm>
using namespace std;
bool cmp(double x,double y){
    return x<y;
}
double num[10005];
int main(){
    double n,m,l;
    double a,b,c;
    int y=0;
    scanf("%d",&y);
    while(y--){
        scanf("%lf %lf %lf %lf",&n,&a,&b,&c);
        double q1,q2,q3,q4;
        int k=0;
        int i;
        for(i=0;i<n;++i){
			q1=c*c+((n-i)*a+(n-i)*b)*((n-i)*a+(n-i)*b);
			num[k++]=sqrt(q1)+sqrt(i*a*i*a+i*b*i*b);
			if(((n-i-1)*a+(n-i)*b)*a<b*(a+c)){
				q2=(c+a)*(c+a)+((n-i-1)*a+(n-i)*b)*((n-i-1)*a+(n-i)*b);
	            num[k++]=sqrt(q2)+sqrt(i*a*i*a+i*b*i*b);
			}
			if(((n-i-1)*b+(n-i)*a)*b<a*(b+c)){
				q3=(c+b)*(c+b)+((n-i-1)*b+(n-i)*a)*((n-i-1)*b+(n-i)*a);
	            num[k++]=sqrt(q3)+sqrt(i*a*i*a+i*b*i*b);
			}
            if(n-i>1&&(n-i-1)*(a+b)*a<b*(a+b+c)&&(n-i-1)*(a+b)*b<a*(a+b+c)){
	            q4=(c+b+a)*(c+b+a)+((n-i-1)*a+(n-i-1)*b)*((n-i-1)*a+(n-i-1)*b);
	            num[k++]=sqrt(q4)+sqrt(i*a*i*a+i*b*i*b);
	        }
        }
        sort(num,num+k,cmp);
        printf("%.3f\n",num[0]);
    }
    return 0;
}

C++11(clang++ 3.9) 解法, 执行用时: 4ms, 内存消耗: 480K, 提交时间: 2019-04-21 10:18:54

#include<bits/stdc++.h>
#define db double
using namespace std;
const db eps = 1e-6;

db sqr(db x) { return x*x; }

db f(db n, db a, db b, db c) {
	db res = sqrt(sqr(c) + sqr(n*a + n*b));
	if(((n-1)*a + n*b) * a - eps < b * (a+c))
		res = min(res, sqrt(sqr(a+c) + sqr((n-1)*a + n*b)));
	if(((n-1)*b + n*a) * b - eps < a * (b+c))
		res = min(res, sqrt(sqr(b+c) + sqr((n-1)*b + n*a)));
	if(n>1 && (n-1) * (a+b) * a - eps < b * (a+b+c) 
		&& (n-1) * (a+b) * b - eps < a * (a+b+c))
		res = min(res, sqrt(sqr(a+b+c) + sqr((n-1)*(a+b))));
	return res;
}

int T;
db n,a,b,c;

int main() {
	// freopen("4.in","r",stdin);
	// freopen("4.out","w",stdout);
	scanf("%d",&T);
	while(T--) {
		db res = 1e18;
		scanf("%lf%lf%lf%lf",&n,&a,&b,&c);
		for(int i=0;i<n;++i) {
			if(sqrt(sqr(i*a) + sqr(i*b)) + f(n-i, a, b, c) < res) {
				res = sqrt(sqr(i*a) + sqr(i*b)) + f(n-i, a, b, c);
			}
		}
		printf("%.3f\n",res);
	}
}

上一题