1. 题目背景与问题解析
这道题目来自2001年全国青少年信息学奥林匹克竞赛(NOIP)提高组的真题,属于典型的计算几何与图论结合类题型。题目描述了一个关于城市间汽车旅行路线规划的问题,考察选手对坐标系处理、最短路径算法和数学建模的综合运用能力。
在实际场景中,这类问题类似于现代导航系统中的多城市路径规划。我们需要处理的是:
- 多个城市之间的位置关系
- 不同交通方式(题目中的"Car"暗示公路旅行)的时间/距离计算
- 最优路径的选择标准(通常是最短时间或最短距离)
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. 输入数据格式与处理
根据NOIP题目的典型特征,输入数据通常采用标准化的格式:
code复制城市数量n
城市1的机场1坐标 机场2坐标 机场3坐标 机场T单位票价
城市2的机场1坐标 机场2坐标 机场3坐标 机场T单位票价
...
出发城市 出发机场 目标城市 目标机场
关键数据处理步骤:
- 城市坐标解析:每个城市给出三个机场坐标,需要确定第四个机场位置
- 票价计算:不同城市间的交通费用计算方式
- 图结构构建:将城市和机场建模为图的节点
注意:实际解题时需要仔细处理输入数据的读取顺序和格式,这是竞赛中常见的失分点。
3. 计算几何关键点:矩形机场定位
题目中每个城市有3个已知机场坐标,需要推导第4个机场位置。这是典型的矩形定位问题:
- 已知三个点A(x1,y1), B(x2,y2), C(x3,y3)
- 计算AB、AC、BC的距离
- 找出直角三角形的直角点(两条短边交点)
- 第四个点D的坐标可通过向量加法得到:D = B + C - A
代码实现示例(C++):
cpp复制struct Point {
double x, y;
};
Point findFourthPoint(Point a, Point b, Point c) {
// 计算各边长的平方
double ab = pow(a.x-b.x,2) + pow(a.y-b.y,2);
double ac = pow(a.x-c.x,2) + pow(a.y-c.y,2);
double bc = pow(b.x-c.x,2) + pow(b.y-c.y,2);
Point d;
if(abs(ab + ac - bc) < 1e-6) { // a是直角点
d.x = b.x + c.x - a.x;
d.y = b.y + c.y - a.y;
} else if(abs(ab + bc - ac) < 1e-6) { // b是直角点
d.x = a.x + c.x - b.x;
d.y = a.y + c.y - b.y;
