[题目来源]:NOIP2001提高组T4

[关键字]:最短路径

[题目大意]:给定平面直角若干个矩形,计算(可经过其他矩形)两个矩形任意顶点间的最短路程费用。

//============================================================================================================

[分析]:其实题目本事没有太大的难点,只需要对每两个点进行连边(其实不用连知道坐标后现求两点间距离)然后求最短路即可。关键是如何知道给定三个顶点的矩形的另一个顶点。

公式:(x1,y1)(x2,y2)(x3,y3)为三个顶点坐标,如果(x1-x2)*(x3-x1)+(y1-y2)*(y3-y1)=0则x4=x2+x3-x1 y4=y2+y3-y1。只要循环直到找到第四个点即可,具体实现可看代码。

[代码]:

View Code

program project1;

type

rec = record

x, y, c: longint;

end;

var

n, tot, costf, st, ed, tc: longint;

pos: array[0..2000] of rec;

x, y: array[1..4] of longint;

costt: array[0..200] of longint;

b: array[0..200] of boolean;

d: array[0..100] of real;

procedure init;

var

i, j, k: longint;

begin

readln(n,costf,st,ed);

for i := 1 to n do

begin

readln(x[1],y[1],x[2],y[2],x[3],y[3],costt[i]);

for j := 1 to 3 do

for k := 1 to 3 do

if j <> k then

if (x[j]-x[k])*(x[6-k-j]-x[j])+(y[j]-y[k])*(y[6-k-j]-y[j]) = 0 then

begin

x[4] := x[k]+x[6-k-j]-x[j];

y[4] := y[k]+y[6-k-j]-y[j];

end;

for j := 1 to 4 do

begin

inc(tot);

pos[tot].x := x[j];

pos[tot].y := y[j];

pos[tot].c := i;

end;

end;

//for i := 1 to tot do writeln(pos[i].x,' ',pos[i].y,' ',pos[i].c);

end;

function dis(x, y: longint):real;

begin

dis := sqrt(sqr(pos[x].x-pos[y].x)+sqr(pos[x].y-pos[y].y));

if pos[x].c = pos[y].c then

dis := dis*costt[pos[x].c]

else dis := dis*costf;

end;

function dij(st: longint):real;

var

i, j, p: longint;

min: real;

begin

fillchar(b,sizeof(b),false);

fillchar(d,sizeof(d),100);

d[st] := 0;

for i := 1 to tot do

begin

min := 1e38;

for j := 1 to tot do

if (not b[j]) and (d[j] < min) then

begin

min := d[j];

p := j;

end;

b[p] := true;

for j := 1 to tot do

if not b[j] then

if d[j] > d[p]+dis(p,j) then d[j] := d[p]+dis(p,j);

end;

dij := 1e38;

for i := 1 to tot do

begin

if pos[i].c = ed then

for j := 0 to 3 do

if d[i+j] < dij then dij := d[i+j];

if pos[i].c = ed then break;

end;

end;

procedure work;

var

i, j: longint;

min, temp: real;

begin

min := 1e38;

for i := 1 to tot do

begin

if pos[i].c = st then

for j := 0 to 3 do

begin

temp := dij(i+j);

if temp < min then min := temp;

end;

if pos[i].c = st then break;

end;

writeln(min:0:1);

end;

begin

assign(input,'d:\in.txt');reset(input);

assign(output,'d:\out.txt');rewrite(output);

readln(tc);

while tc > 0 do

begin

init;

work;

dec(tc);

end;

close(input);

close(output);

end.

init tarray 太大_[NOIP 2001提高组T4]Car的旅行路线相关推荐

  1. NOIP 2018提高组复赛C/C++试题及答案详解

    NOIP 2018提高组历年真题 CCF NOIP2018 初赛提高组 C++语言试题 第 1 页,共9 页 第二十四届全国青少年信息学奥林匹克联赛初赛 提高组 C++语言试题 竞赛时间:2018 年 ...

  2. NOIP 2013 提高组 货车运输

    描述 A 国有 n 座城市,编号从 1 到 n,城市之间有 m 条双向道路.每一条道路对车辆都有重量限制,简称限重.现在有 q 辆货车在运输货物,司机们想知道每辆车在不超过车辆限重的情况下,最多能运多 ...

  3. NOIP 2015 提高组 初赛

    NOIP 2015 提高组 初赛 疑难点 学习 感悟. 一. 3. 示例如下(来自自个的理解): 101.101 十进制 转十进制1*10^2+0*10^1+1*10^0+1*10^-1+0*10^- ...

  4. NOIP 2017 提高组 初赛

    NOIP 2017 提高组 初赛 做题感悟. 五.完善程序,是本张试卷最简单的题目,两道题做完,大约花了10分钟.2017-10-17 18:25 对了答案,破天荒,全对. 1.(大整数除法) 有如下 ...

  5. [NOIP 2013提高组]转圈游戏 题解

    这题在洛谷上是道黄题,即[普及/提高-] 所以虽然是提高组的,但是其实挺简单的. 我们来看下题面: [NOIP 2013]转圈游戏 刚看到题面作为一个蒟蒻感觉它都不配做黄题,但是直到我看清楚了后发现它 ...

  6. NOIP 2008 提高组 复赛 message 传字条

    NOIP 2008 提高组 复赛 message 传字条 1.样例很快模拟成功,但感觉是凑出来的,没有章法. 2.深度优先遍历,但感觉容易超时. 3.动态规划?翻看他人代码,发现动态规划的写法,确实想 ...

  7. NOIP 2016 提高组 初赛

    NOIP 2016 提高组 初赛 疑难点 学习 感悟. 一. 2.该题81容易看成81次按键,实际是屏幕上出现的第81个字符,实际按键次数超过81次. 3.异或,相同位上,数字相同取0,数字不同取1, ...

  8. for循环数据量太大_中文文本分类roberta大力出奇迹之数据量大的问题

    问题描述: 笔者在文本分类场景中使用了roberta+pool+dense的三分类模型.采用预训练模型做项目的时候经常苦于数据太少,模型泛化性差,因此收集了1300W数据.在我尝试暴力出奇迹的时候,遇 ...

  9. broken pipe怎么解决 数据太大_振动筛噪音太大、扬尘问题严重,不够环保怎么办?看看这篇文章,帮您解决困扰...

    振动筛是一类重型筛分设备,具有产量大.结构简单.使用寿命长等特点.它在运行时不但产生机械噪声,而且由于矿石的筛分.转运和相互撞击等原因,还产生大量的粉尘,严重地污染作业环境,影响工人身体健康.本文分享 ...

最新文章

  1. 浅谈JVM的GC策略
  2. Java里的容器存放的元素必须是1个对象.
  3. 【转摘】Office三剑客之间的格式互换
  4. Android ListView与Arrayadapter之间的搭配使用
  5. arch linux 安装 arm,给树莓派安装 Arch Linux ARM
  6. Gradle Build速度加快终极方法(android studio)
  7. matlab第二次上机作业答案,第二次上机作业
  8. 电商网站模板_阿里云建站:模板建站与定制建站怎么选(小白参考)
  9. vim 命令模式 筛选_10个步骤的筛选器模式
  10. Markdown笔记神器Typora配置Gitee图床
  11. jsp中page指令用法详解
  12. dvi和hdmi 知乎_HDMI和DVI有什么区别? 哪个更好?
  13. Android AP 和 BP的概念
  14. Excel 使用ODBC直接访问
  15. mysql重复写入_MYSQL避免重复插入记录的三种方法
  16. 2022-08-15 第四小组 修身课 学习笔记(every day)
  17. croc使用 —(两个电脑间传输文件)
  18. 驱动级键盘记录器与安全密码框(能获取QQ密码)
  19. 修改注册表 去除Win7系统快捷方式箭头
  20. Java Web简答题

热门文章

  1. 将你的Vim 打造成轻巧强大的IDE
  2. opencv连续读图
  3. 建立Win32 Console Project时会出“error LNK1123” 错误
  4. 中国计算机手机全部被黑,云南一高校电脑全被黑
  5. 机器学习实战应用50讲(一)-使用student’s T检验的未必是学生
  6. Bash脚本教程之引号和转义
  7. php双引号解析漏洞
  8. expr命令 linux,Shell expr命令进行整数计算的实现
  9. js实现字体和容器宽高随窗口改变
  10. apache配置-html碎片shtml格式