uva10668 - Expanding Rods

链接

https://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&page=show_problem&problem=1609

题解

经过各种推导以及瞎搞,也算是得到了一个AC
设圆心坐标为 ( − a , 0 ) (-a,0) (a,0)
可以列出方程 L ′ 2 = a 2 + L 2 4 × a r c t a n ( a 2 L ) \frac{L'}{2}=\sqrt {a^2+\frac{L^2}{4}} \times arctan( \frac{a}{2L} ) 2L=a2+4L2 ×arctan(2La)
f ( a ) = a 2 + L 2 4 × a r c t a n ( a 2 L ) f(a)=\sqrt {a^2+\frac{L^2}{4}} \times arctan( \frac{a}{2L} ) f(a)=a2+4L2 ×arctan(2La)
求导,并令 f ′ ( a ) = 0 f'(a)=0 f(a)=0,得到一个方程 1 = 1 a a r c t a n ( L 2 a ) 1=\frac{1}{a} arctan( \frac{L}{2a} ) 1=a1arctan(2aL),右边单调,所以这个方程要么只有一个解,要么没有解
求极限发现 f ′ ( 0 + ) = 0 f'(0^+)=0 f(0+)=0 f ( + ∞ ) = + ∞ f(+\infty)=+\infty f(+)=+,结合零点个数,得到导函数横不小于 0 0 0
f ( a ) f(a) f(a)就单调不减
所以我可以二分求解
注意当 L ′ = L L'=L L=L时,原方程只有当 a → + ∞ a\rightarrow +\infty a+时才成立,解不出实数解,需要特判

代码

//数学推导、二分
#include <bits/stdc++.h>
#define eps 1e-8
using namespace std;
double L, n, C, L2;
int main()
{
    double l, r, a, ans;
    while(scanf("%lf%lf%lf",&L,&n,&C), L>-eps)
    {
        L2=(1+n*C)*L;
        if(fabs(n*C)<eps)
        {
            printf("0.000\n");
            continue;
        }
        l=0, r=1e10, a=(l+r)/2;
        for(int i=1;i<=100;i++)
        {
            if(sqrt(a*a+L*L/4)*atan(L/(2*a))<L2/2)r=a;
            else l=a;
            a=(l+r)/2;
        }
        ans=sqrt(a*a+L*L/4)-a;
        printf("%.3lf\n",fabs(ans)<0.0005?0.0:ans);
    }
    return 0;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
DataFrame expanding 是用于在 Pandas 中执行 rolling 和 expanding 操作的方法之一。它可以用来计算滚动或扩展窗口中的统计数据,例如滚动平均值、滚动标准偏差等。 rolling 操作是指对于一个固定大小的窗口,沿着时间序列向前滑动,对窗口中的数据进行统计运算。而 expanding 操作是指从数据集的起始点开始,逐步扩大窗口的大小,对窗口中的数据进行统计运算。 下面是一个简单的示例,展示如何使用 expanding 方法计算累计和: ```python import pandas as pd # 创建一个包含随机整数的 DataFrame df = pd.DataFrame({'data': [1, 2, 3, 4, 5]}) # 使用 expanding 方法计算累计和 expanding_sum = df['data'].expanding().sum() print(expanding_sum) ``` 输出结果为: ``` 0 1.0 1 3.0 2 6.0 3 10.0 4 15.0 Name: data, dtype: float64 ``` 这里,我们使用 `expanding()` 方法创建了一个扩展窗口,并对 `data` 列进行累计求和。由于这是一个扩展窗口,因此在每一行中,我们都计算了从数据集起始点开始的所有值的累计和。 类似地,rolling 方法也可以用于计算滚动窗口内的统计数据。例如,以下代码演示了如何使用 rolling 方法计算一个窗口大小为 3 的滚动均值: ```python import pandas as pd # 创建一个包含随机整数的 DataFrame df = pd.DataFrame({'data': [1, 2, 3, 4, 5]}) # 使用 rolling 方法计算滚动均值 rolling_mean = df['data'].rolling(window=3).mean() print(rolling_mean) ``` 输出结果为: ``` 0 NaN 1 NaN 2 2.000000 3 3.000000 4 4.000000 Name: data, dtype: float64 ``` 这里,我们使用 `rolling()` 方法创建了一个大小为 3 的滚动窗口,并对 `data` 列进行滚动均值计算。在前两个行中,由于窗口大小不够,因此没有计算出平均值,因此这些行中的值为 NaN。在第三行中,我们计算了前三个值的平均值,并将其赋值给了第三个行。以此类推,直到最后一个行,我们计算了前五个值的平均值,得到了 4.0。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值