1 条题解

  • 0
    @ 2025-5-1 17:14:30

    解决方法

    方法思路

    1. 逐层计算:从底层开始,逐层向上推导每个圆柱的位置。
    2. 几何公式:利用几何关系计算上层圆柱的位置。对于相邻两个下层圆柱 (x1,y1)(x_1, y_1)(x2,y2)(x_2, y_2),上层圆柱 (x,y)(x, y) 满足:
      • 中点公式:$x_{\text{mid}} = \frac{x_1 + x_2}{2}, \quad y_{\text{mid}} = \frac{y_1 + y_2}{2}$
      • 垂直高度:h=4(间距2)2h = \sqrt{4 - \left(\frac{\text{间距}}{2}\right)^2}
      • 最终坐标:$x = x_{\text{mid}} - \frac{dy \cdot h}{\text{间距}}, \quad y = y_{\text{mid}} + \frac{dx \cdot h}{\text{间距}}$,其中 dx=x2x1dx = x_2 - x_1dy=y2y1dy = y_2 - y_1

    解决代码

    #include <stdio.h>
    #include <math.h>
    #include<algorithm>
    using namespace std;
    double num[20][20], numy[20][20];
     
    int n;
     
    void getpoint( double x1, double y1, double x2, double y2 , double & x, double & y )
    {
    	double a, b, c, d, e, f;
    	a= x2-x1;
    	b= y2-y1;
    	c= (x1+x2)/2.0;
    	d= (y1+y2)/2.0;
    	e= (y1-y2)/2.0;
    	f= (x1-x2)/2.0;
    	y=sqrt( (4-e*e-f*f)*a*a/(a*a+b*b) ) + d;
    	x= ( b*( d-y )/a )+c;
    }
     
    int main()
    {
    	int t;
    	while(scanf("%d", &t) && t)
    	{
    		int i, j;
    		for ( i = 0; i < t ; i++ )
    		{
    			scanf("%lf", num[t-1]+i);
    			numy[t-1][i]=1.0;
    		}
    		sort(num[t-1],num[t-1]+t);
    		for ( j = t-1; j > 0 ; j-- )
    		{
    			for ( i = 0; i < t; i++ )
    			{
    				getpoint(num[j][i], numy[j][i], num[j][i+1], numy[j][i+1], num[j-1][i], numy[j-1][i]);
    			}
    		}
    		printf("%.4f %.4f\n",num[0][0], numy[0][0]);
    	}
    	return 0;
    }
    

    代码解释

    1. 输入处理:读取底层圆柱数 nn 及其 xx 坐标,初始化底层圆柱的坐标为 (x,1.0)(x, 1.0)
    2. 逐层计算
      • 根据相邻下层圆柱的坐标,计算上层圆柱的位置。
      • 使用几何公式推导上层圆柱的坐标,确保满足距离约束。
    3. 输出结果:输出顶部圆柱的坐标,保留四位小数。

    该算法时间复杂度为 O(n2)O(n^2),适用于 n10n \leq 10 的输入规模。通过逐层递推,精确计算每个圆柱的坐标。

    • 1

    信息

    ID
    1195
    时间
    2000ms
    内存
    256MiB
    难度
    10
    标签
    递交数
    4
    已通过
    1
    上传者