xmu 1125 - 越野车大赛(三分)

本文讨论了如何计算越野车大赛中以最高速度行驶时,从比赛场地左上角到右下角的最短完成时间。通过数学公式和算法实现,详细解释了求解过程。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

题意:

TheBeet正在参加一场越野车大赛。比赛的场地如右图:
  共分三块,每一块地面的长宽均为N与M,但地表情况不同,越野车在这段路面上的最高速度也不同。
  蓝色线表示TheBeet可能的行车路线。
  比赛的要求是要求选手从比赛的场地左上角驾车至右下角。TheBeet想知道如果他在所有路段都以最快速度行驶(不考虑加速阶段),最快能在多少时间内完成比赛。


把 横向的边放到X轴上,设第一拐点距起点为x,第二个拐点距第一个拐点的距离为y,则方程很容易的便列出,

f(x,y) =sqrt(x*x+M*M)/S1+sqrt(y*y+M*M)/S2+sqrt((N-x-y)*(N-x-y)+M*M)/S3;

我们 很容易的便可以发现这是x和y的二次函数,且x和y的二次项的系数都是大于0的,

所以,它的函数曲线是下凸的,所以我们用两层的三分便可以求解得答案了。

代码如下:

#include <cstdio>
#include <cstring>
#include <cstdlib>
#include <cmath>
#include <queue>
#include <stack>
#include <list>
#include <vector>
#include <map>
#include <algorithm>

#define INF 0x7fffffff
#define eps 1e-7

using namespace std;

int m, n, s1, s2, s3;
double calcu(double x, double y)
{
    return sqrt(m*m+x*x)/s1+sqrt(m*m+y*y)/s2+sqrt((n-x-y)*(n-x-y)+m*m)/s3;
}
int main()
{
    scanf("%d%d%d%d%d", &n, &m, &s1, &s2, &s3);
    double L = 0, R = n;
    double mid, midmid, t1, t2;
    double LL, RR;
    double mid_, midmid_, tt1, tt2;
    double ans = 1e30;
    while(R-L>eps)
    {
        mid = (L+R)/2;
        midmid = (mid+R)/2;
        LL = 0, RR = n;
        while(RR-LL>eps)
        {
            mid_ = (LL+RR)/2;
            midmid_ = (mid_+RR)/2;
            tt1 = calcu(mid,mid_);
            tt2 = calcu(mid,midmid_);
            if(tt1<tt2) RR = midmid_;
            else LL = mid_;
        }
        t1 = calcu(mid, LL);
        LL = 0; RR = n;
        while(RR-LL>eps)
        {
            mid_ = (LL+RR)/2;
            midmid_ = (mid_+RR)/2;
            tt1 = calcu(midmid,mid_);
            tt2 = calcu(midmid,midmid_);
            if(tt1<tt2) RR = midmid_;
            else LL = mid_;
        }
        t2 = calcu(midmid, LL);
        if(t1<t2) { R = midmid; ans = min(ans, t1); }
        else  { L = mid; ans = min(ans, t2); }
    }
    printf("%.10lf\n",ans);
    return 0;
}

<think>好的,我现在需要解决用户遇到的CMake错误,具体是关于找不到'xmu'模块的问题。首先,我应该回顾用户提供的错误信息,以便准确理解问题所在。错误信息显示在编译过程中,CMake无法找到名为'xmu'的包,导致配置失败。用户可能是在构建某个项目时遇到了这个问题,尤其是在处理dlphook部分的CMakeLists.txt文件时触发了这个错误。 首先,我需要确定'xmu'是什么。根据经验,xmu可能与X Window System有关,特别是Xorg的扩展库。通常,以'xmu'命名的包可能指的是X Miscellaneous Utilities库,也就是libXmu。在基于Debian或Ubuntu的系统上,开发库通常以-dev后缀的包存在,所以用户可能需要安装libxmu-dev。对于其他Linux发行版,比如Fedora或CentOS,包名可能有所不同,例如libXmu-devel。 接下来,我需要考虑用户的操作系统类型,以便给出正确的安装命令。用户提供的路径中包含/usr/share/cmake-3.13,这提示可能是在Ubuntu或Debian系的系统上,因为CMake的默认安装路径通常如此。因此,我会首先建议安装libxmu-dev包,使用apt-get命令。但为了全面,也应该提到其他发行版的对应包。 然后,我需要检查用户是否已经安装了该库但可能路径未正确设置,或者是否存在其他依赖问题。不过,根据错误信息,CMake通过pkg-config查找包,因此安装正确的开发包应该能解决问题,因为pkg-config需要相应的.pc文件来识别库的存在。 另外,用户可能需要确保在安装库之后重新运行CMake,因为CMake会缓存之前的检查结果。建议用户清理构建目录(比如删除CMakeCache.txt和CMakeFiles)并重新运行cmake命令,以确保检测到新安装的库。 最后,如果问题依然存在,可能需要进一步检查项目的CMakeLists.txt文件,特别是第111行附近的pkg_check_modules调用,确认所需的模块名称是否正确,或者是否存在拼写错误。有时候,项目文档或README文件中也会提到特定的依赖项,用户可以参考这些文档进行验证。 总结步骤: 1. 安装libxmu-dev(或对应发行版的包)。 2. 清理CMake缓存并重新配置。 3. 检查CMakeLists.txt中的模块名称是否正确。 4. 查阅项目文档确认依赖项。 如果上述步骤无法解决问题,可能需要更深入的分析,例如查看pkg-config是否能够正确找到xmu模块,或者是否存在版本兼容性问题。</think>遇到CMake报错`No package 'xmu' found`时,说明系统缺少`Xmu`库的开发文件。以下是逐步解决方案: --- ### 1. 安装缺失的库 `xmu`属于**X Window System**的扩展工具库,需安装其开发包: - **Ubuntu/Debian**: ```bash sudo apt-get install libxmu-dev ``` - **Fedora/CentOS**: ```bash sudo dnf install libXmu-devel # Fedora sudo yum install libXmu-devel # CentOS ``` - **Arch Linux**: ```bash sudo pacman -S libxmu ``` --- ### 2. 清理并重新配置CMake 安装后需清理旧的CMake缓存,再重新生成: ```bash rm -rf CMakeCache.txt CMakeFiles # 删除缓存 cmake . # 重新运行CMake ``` --- ### 3. 检查CMakeLists.txt配置 确认项目`CMakeLists.txt`(第111行附近)的依赖配置是否正确: ```cmake pkg_check_modules(XMU REQUIRED xmu) # 检查模块名是否为xmu ``` --- ### 4. 验证pkg-config是否能找到xmu 手动检查`pkg-config`是否能定位到库: ```bash pkg-config --exists --print-errors xmu ``` - 若输出空白,表示配置成功。 - 若报错,需检查库安装路径是否在`PKG_CONFIG_PATH`中。 --- ### 5. 其他可能原因 - **交叉编译环境**:确保为当前主机架构安装库,而非目标架构。 - **版本冲突**:某些项目需要特定版本的`libxmu`,尝试安装旧版本。 --- ### 总结步骤流程图 ```plaintext 安装libxmu-dev → 清理CMake缓存 → 重新运行CMake → 验证pkg-config ``` 如果问题仍未解决,请提供完整的CMake输出和操作系统版本,以便进一步分析。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值