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); } }