P1027 [NOIP2001 提高组] Car 的旅行路线

news2024/12/23 12:30:35

题目描述

又到暑假了,住在城市 A 的 Car 想和朋友一起去城市旅游。
她知道每个城市都有 44 个飞机场,分别位于一个矩形的 44 个顶点上,同一个城市中两个机场之间有一条笔直的高速铁路,第 �i 个城市中高速铁路了的单位里程价格为 ��Ti​,任意两个不同城市的机场之间均有航线,所有航线单位里程的价格均为 �t。

图例(从上而下)

机场
高速铁路
飞机航线

注意:图中并没有标出所有的铁路与航线。

那么 Car 应如何安排到城市B的路线才能尽可能的节省花费呢?她发现这并不是一个简单的问题,于是她来向你请教。

找出一条从城市 A 到 B 的旅游路线,出发和到达城市中的机场可以任意选取,要求总的花费最少。

输入格式

第一行为一个正整数 �n,表示有 �n 组测试数据。

每组的第一行有 44 个正整数 �,�,�,�s,t,A,B。

�S 表示城市的个数,�t 表示飞机单位里程的价格,�A,�B 分别为城市A,B 的序号。

接下来有 �S 行,其中第 �i 行均有 77 个正整数��1,��1,��2,��2,��3,��3,��xi1​,yi1​,xi2​,yi2​,xi3​,yi3​,Ti​ ,这当中的 (��1,��1xi1​,yi1​),(��2,��2xi2​,yi2​),(��3,��3xi3​,yi3​)分别是第 �i 个城市中任意 33 个机场的坐标,��Ti​ 为第 �i 个城市高速铁路单位里程的价格。

输出格式

共有 �n 行,每行 11 个数据对应测试数据。
保留一位小数。

输入输出样例

输入 #1复制

1
3 10 1 3
1 1 1 3 3 1 30
2 5 7 4 5 2 1
8 6 8 8 11 6 3

输出 #1复制

47.5

说明/提示

【数据范围】
对于 100%100% 的数据,1≤�≤101≤n≤10,1≤�≤1001≤S≤100,1≤�,�≤�1≤A,B≤S

【题目来源】

NOIP 2001 提高组第四题

#include<iostream>
#include<algorithm>
#include<cstring>
#include<cmath>
#include<cstdio>
using namespace std;
const int maxn = 4010;
struct infor {
	int x,y;
	int num;
} city[maxn];
int sub[maxn];
int map[maxn][maxn];
double dp[maxn][maxn];
double dist[maxn][maxn];
void add(int cnt) {
	int x1,x2,x3,y1,y2,y3;
	x1 = city[cnt-2].x;
	x2 = city[cnt-1].x;
	x3 = city[cnt].x;
	y1 = city[cnt-2].y;
	y2 = city[cnt-1].y;
	y3 = city[cnt].y;
	int k;
	int cx,cy;
	for(int i=1; i<=3; i++) {
		if(i==1) {
			if(x1==x2 && y1==y3) {
				cx = x3-x1;
				city[++cnt].x = x2+cx;
				city[cnt].y = y2;
				city[cnt].num = city[cnt-1].num;
				return ;
			} else if(x1==x3 && y1==y2) {
				cx = x2-x1;
				city[++cnt].x = x3+cx;
				city[cnt].y = y3;
				city[cnt].num = city[cnt-1].num;
				return ;
			} else if(x1==x2 || x1==x3) continue;
			k = ((y2-y1)*(y3-y1))/((x2-x1)*(x3-x1));
			if(k==-1) {
				cx = x1-x2;
				cy = y1-y2;
				city[++cnt].x = x3-cx;
				city[cnt].y = y3-cy;
				city[cnt].num = city[cnt-1].num;
				return ;
			}
		} else if(i==2) {
			if(x2==x1 && y2==y3) {
				cx = x3-x2;
				city[++cnt].x = x2+cx;
				city[cnt].y = y1;
				city[cnt].num = city[cnt-1].num;
				return ;
			} else if(x2==x3 && y2==y1) {
				cx = x1-x2;
				city[++cnt].x = x2+cx;
				city[cnt].y = y3;
				city[cnt].num = city[cnt-1].num;
				return ;
			} else if(x2==x1||x2==x3) continue;
			k = ((y1-y2)*(y3-y2))/((x1-x2)*(x3-x2));
			if(k==-1) {
				cx = x2-x1;
				cy = y2-y1;
				city[++cnt].x = x3-cx;
				city[cnt].y = y3-cy;
				city[cnt].num = city[cnt-1].num;
				return ;
			}
		} else if(i==3) {
			if(x3==x1 && y3==y2) {
				cx = x2-x3;
				city[++cnt].x = x1+cx;
				city[cnt].y = y1;
				city[cnt].num = city[cnt-1].num;
				return ;
			} else if(x3==x2 && y3==y1) {
				cx = x1-x3;
				city[++cnt].x = x2+cx;
				city[cnt].y = y2;
				city[cnt].num = city[cnt-1].num;
				return ;
			} else if(x3==x1 || x3==x2) continue;
			k = ((y1-y3)*(y2-y3))/((x1-x3)*(x2-x3));
			if(k==-1) {
				cx = x3-x1;
				cy = y3-y1;
				city[++cnt].x = x2-cx;
				city[cnt].y = y2-cy;
				city[cnt].num = city[cnt-1].num;
				return ;
			}
		}
	}
}
double dis(int a,int b) {
	int x1 = city[a].x;
	int x2 = city[b].x;
	int y1 = city[a].y;
	int y2 = city[b].y;
	double ans = 0;
	ans = sqrt((x2-x1)*(x2-x1) + (y2-y1)*(y2-y1));
	return ans;
}
double floyed(int n,int t,int a,int b) {
	n = 4*n;
	for(int i=1; i<=4*n; i++) {
		for(int j=1; j<=4*n; j++) {
			dist[i][j] = dis(i,j);
		}
	}
	for(int i=1; i<=n; i++) {
		for(int j=1; j<=n; j++) {
			if(i==j) dp[i][j] = 0;
			else {
				if(city[i].num == city[j].num) {
					dp[i][j] = dist[i][j] * sub[city[i].num];
				} else dp[i][j] = dist[i][j] * t;
			}
		}
	}
	for(int k=1; k<=n; k++) {
		for(int i=1; i<=n; i++) {
			for(int j=1; j<=n; j++) {
				dp[i][j] = min(dp[i][j],dp[i][k]+dp[k][j]);
			}
		}
	}
	double ans = 0x7f7f7f7f;
	for(int i=1; i<=n; i++) {
		for(int j=1; j<=n; j++) {
			if(city[i].num==a&&city[j].num==b) {
				ans = min(ans,dp[i][j]);
			}
		}
	}
	return ans;
}
int main() {
	int T;
	cin >> T;
	while(T--) {
		memset(sub,0,sizeof(sub));
		int n,t,a,b;
		int cnt = 1;
		cin >> n >> t >> a >> b;
		for(int i=1; i<=n; i++) {
			cin >> city[cnt].x >> city[cnt].y;
			city[cnt++].num = i;
			cin >> city[cnt].x >> city[cnt].y;
			city[cnt++].num = i;
			cin >> city[cnt].x >> city[cnt].y;
			city[cnt].num = i;
			cin >> sub[i];
			add(cnt);
			cnt+=2;
		}
		memset(map,0,sizeof(map));
		for(int i=1; i<=cnt; i++) {
			int x = city[i].x;
			int y = city[i].y;
			int num = city[i].num;
			map[x][y] = num;
		}
		double ans = floyed(n,t,a,b);
		printf("%.1lf\n",ans);
	}
	return 0;
}

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/446960.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【let变量声明以及声明特性】

let变量声明以及声明特性 1 let变量声明2 let声明特性3 let经典案例实践 1 let变量声明 <script>// 声明变量let a;let b,c,d;let e 100;let f 521, g iloveyou, h [];</script>2 let声明特性 1> 变量不能重复声明2> 块级作用域、全局作用域、函数作用域…

4.5 函数最佳逼近

学习目标&#xff1a; 要学习函数最佳逼近&#xff0c;我可能会采取以下几个步骤&#xff1a; 学习基本的数学知识和工具&#xff1a;函数最佳逼近涉及到线性代数、实变函数、泛函分析等多个领域的知识&#xff0c;因此我需要先学习这些基础知识和工具&#xff0c;例如矩阵和向…

论文各子结构的实现

本文将简明介绍人工智能论文各子结构的实现方法&#xff0c;重点指出了各部分实现时的要点&#xff0c;帮助读者高效地完成论文的写作。 1. 标题 论文标题的确定必须遵循明确而有吸引力的原则。论文的题目需要准确反映自己论文的研究内容和创新点&#xff0c;同时还必须具有吸…

嵌入式软件中常见的 8 种数据结构详解

目录 第一&#xff1a;数组 1、数组的应用 第二&#xff1a;链表 1、链表操作 2、链表的应用 第三&#xff1a;堆栈 1、堆栈操作 2、堆栈的应用 第四&#xff1a;队列 1、队列操作 2、队列的应用 第五&#xff1a;哈希表 1、哈希函数 2、哈希表的应用 第六&#…

chatgpt智能提效职场办公-ppt怎么设置背景图片

作者&#xff1a;虚坏叔叔 博客&#xff1a;https://xuhss.com 早餐店不会开到晚上&#xff0c;想吃的人早就来了&#xff01;&#x1f604; 在 Microsoft PowerPoint 中&#xff0c;可以按照以下步骤设置背景图片&#xff1a; 打开 PowerPoint 文档并进入“设计”选项卡。 在…

HJY系列数字式交流电压继电器(数显型) 导轨安装 约瑟JOSEF

1 用途 HJY系列数字式交流电压继电器为瞬时动作特性&#xff0c;用于发电机&#xff0c;变压器&#xff0c;输电线路的继电保护装 置中作为过压或欠压的闭锁启动元件。 安装结构 导轨安装9&#xff0c;导轨安装E两种结构方式&#xff0c;具体尺寸请参考外型尺寸图。特点 (1). …

1小时学会CSS-下

今天给大家分享的内容包含CSS 盒子模型&#xff0c;CSS 标准布局&#xff0c; CSS 浮动布局 &#xff0c; 并以案列进行详细说明。 一、CSS 盒子模型 CSS 将所有元素都当成盒子&#xff0c;CSS布局其实就是如何堆放盒子。 组成: content(内容)—>padding(内边距)—>bor…

【python视图1】networkx操作图

一、说明 数据可视化需要显示种种数据&#xff0c;matplotlib负责曲线类画图&#xff0c;然而类似于图论的操作用什么方法。这里用networkx程序包完成。本文专门介绍这种程序包的用法。 二、生成图&#xff08;Creating a graph&#xff09; 2.1 创建一个没有节点和边的空图。…

C++进阶——二叉搜索树BST

C进阶——二叉搜索树BST 其实应该是二叉树内容的进阶版本&#xff1a; 二叉树在前面C数据结构阶段已经讲过&#xff0c;本节取名二叉树进阶是因为&#xff1a; map和set特性需要先铺垫二叉搜索树&#xff0c;而二叉搜索树也是一种树形结构二叉搜索树的特性了解&#xff0c;有…

十七、WLAN概述

文章目录 前言一、WLAN 网络演化过程二、IEEE 802.11主要标准三、WLAN 解决方案四、模拟器登录AC1、配置AC2、配置云3、登录 前言 无线局域网WLAN&#xff08;Wireless Local Area Network&#xff09;是一种利用无线技术实现主机等终端设备灵活接入以太网的技术&#xff0c;它…

hadoop集群部署常见问题解决

1、权限 •Permission denied&#xff08;权限被拒绝&#xff09; Hadoop的运行日志在$HADOOP_HOME/logs内 也可以查看日志排错 只要出现Permission denied就是权限问题 hadoop安装文件夹或/data文件夹&#xff0c;未被授权给hadoop用户&#xff0c;所以无权限操作 2、环境变…

在金融领域使用机器学习的 9个技巧

机器学习已经倍证明可以预测结果和发掘隐藏的数据模式。但是必须小心使用&#xff0c;并遵循一些规则&#xff0c;否则就会在数据的荒野中徘徊而无所获。使用机器学习进行交易的道路充满了陷阱和挑战&#xff0c;只有那些勤奋认真地遵循规则的人才能从中获得收益。下面是一些技…

如何建立到NAS中新增容器的ssh连接

注&#xff1a;首先需按照教程建立Zerotier连接&#xff0c;然后进入新建的nginx镜像&#xff0c;为root用户建立密码。 查看容器类型 Debian 系镜像: cat /etc/issue Redhat 系镜像: cat /etc/redhat-release Alpine 系镜像: cat /etc/os-release 安装并启动ssh apt-get …

SHELL环境变量和引用

目录 1、判断当前磁盘剩余空间是否有20G&#xff0c;如果小于20G&#xff0c;则将报警邮件发送给管理员&#xff0c;每天检查一次磁盘剩余空间。 a.安装邮件服务 b.创建脚本对要求进行设计 c.编辑配置文件 ​编辑d.做计划任务 ​编辑 e.进行测试 2、判断web服务是否运行…

POLARDB 从一个使用者的角度来说说,POALRDB 怎么打败 MYSQL RDS

开头还是介绍一下群&#xff0c;如果感兴趣polardb ,mongodb ,mysql ,postgresql ,redis 等有问题&#xff0c;有需求都可以加群群内有各大数据库行业大咖&#xff0c;CTO&#xff0c;可以解决你的问题。加群请联系 liuaustin3 &#xff0c;在新加的朋友会分到2群&#xff08;共…

记录-实现深拷贝的四种方式

这里给大家分享我在网上总结出来的一些知识&#xff0c;希望对大家有所帮助 概念介绍 深拷贝&#xff1a;在堆内存中重新开辟一个存储空间&#xff0c;完全克隆一个一模一样的对象 浅拷贝&#xff1a;不在堆内存中重新开辟空间&#xff0c;只复制栈内存中的引用地址。本质上两个…

Python双向循环链表的操作

目录 一、双向循环链表 双向循环链表图 二、双向循环链表的操作 1、判断链表是否为空 2&#xff0c;链表长度 3&#xff0c;遍历整个链表 4&#xff0c;在链表头部添加元素 5、链表尾部添加元素 6&#xff0c;在指定位置插入元素 7&#xff0c;修改指定位置的元素 8&a…

被裁后找不到工作,本质上是因为原来的能力就配不上高薪,如果技术好,根本不怕被裁,相当于白送n+1!...

被裁员后&#xff0c;能要求公司补缴公积金吗&#xff1f; 一位网友问&#xff1a; 被裁员了&#xff0c;要求公司把历史公积金全部足额缴纳&#xff0c;现在月薪2.3万&#xff0c;但公司每个月只给自己缴纳300元公积金&#xff0c;结果一次补了二十多万&#xff0c;一次性取出…

进程等待、进程替换

目录 进程等待 waitpid函数 wait函数 进程替换 进程等待 进程等待的意义 如果子进程退出&#xff0c;父进程如果不管不顾&#xff0c;就可能造成‘僵尸进程’的问题&#xff0c;进而造成内存泄漏。 另外&#xff0c;进程一旦变成僵尸状态&#xff0c;那就刀枪不入&#xff…

5.5G的关键一跳!将数智未来照进现实

编辑&#xff1a;阿冒 设计&#xff1a;沐由 作为数字时代的三大思想家之一&#xff0c;乔治吉尔德在1993年就指出&#xff0c;未来25年内主干网的带宽每6个月增长一倍&#xff0c;其增长速度是摩尔定律预测的CPU增长速度的3倍。 这就是著名的吉尔德定律&#xff08;Gilder’s …