巨坑练习题!!!—— Car的旅行线路
在看题目之前,请童鞋们做好心理准备╮(╯▽╰)╭
题目描述
又到暑假了,住在城市A的Car想和朋友一起去城市B旅游。 她知道每个城市都有四个飞机场,分别位于一个矩形的四个顶点上,同一个城市中两个机场之间有一条笔直的高速铁路,第I个城市中高速铁路了的单位里程价格为Ti,任意两个不同城市的机场之间均有航线,所有航线单位里程的价格均为t。 那么Car应如何安排到城市B的路线才能尽可能的节省花费呢?她发现这并不是一个简单的问题,于是她来向你请教。 任务: 找出一条从城市A到B的旅游路线,出发和到达城市中的机场可以任意选取,要求总的花费最少。
输入
第一行为一个正整数n(1≤n≤10),表示有n组测试数据。
每组的第一行有四个正整数s,t,A,B。 S(0<S≤100)表示城市的个数,t表示飞机单位里程的价格,A,B分别为城市A,B的序号,(1≤A,B≤S)。
接下来有S行,其中第I行均有7个正整数xi1,yi1,xi2,yi2,xi3,yi3,Ti,这当中的(xi1,yi1),(xi2,yi2),(xi3,yi3)分别是第I个城市中任意三个机场的坐标,TI为第I个城市高速铁路单位里程的价格。
输出
共有n行,每行一个数据对应测试数据,结果保留2位小数。
样例输入
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
样例输出
47.55
让我缓缓,现在看这道题都有心理阴影…………
首先,来看看这道题需要什么技巧:
1、求每个城市第四个飞机场的坐标
2、将每个机场的直线距离求出,乘以火车或飞机的单价
3、遍历图,找最短边
4、输出最小值
5、因有多组数据,所以要初始化
让我们来一个一个的解决吧
1、首先,试着在直角坐标系上画一个任意四边形,让我们来探究规律,我也画了一个任意四边形:
观察一下,我们发现任意一个四边形:| XS1 - XS2 | =
| XS3 - XS4 | | YS1 - YS2
| = | YS3- YS4 | (S1、S2、S3、S4按顺序排列)
所以只要确定哪一个是三点之间的直角点,那么与其对应的未知点就可以用以上公式求出来~\(≧▽≦)/~
代码实现实在不行的话,待会儿看样例代码吧~
2、将城市中的四个点求出之后,就直接乘以此城市的火车价,算出dis[ i ][ j ],最后在同一循环,判断此边是否赋值,如果没有,将两点距离算出来,直接乘以飞机价格 ( 两点间距离公式:AB = sqrt( pow( XA
- XB ) + pow( YA - YB ) ) )
3、先复习一下四种算法——>(点击打开链接 点击打开链接)首先,Car可以从A城市的任意一个机场到B城市的任意一个机场,所以不确定起点终点,而第2、3、4种算法都要确定起点,所以我们只能用Floyed算法,先来算算时间复杂度(O(n^3)(nmax=400)),明显不会超时,所以,就要这个了!
4、最小值,由于有两个城市,四个点,只需循环16次即可,找出最小的dis[ i ][ j ],没什么难度
5、初始化只需将每个数组清空就行啦~\(≧▽≦)/~
好了,难点的处理就这些,还有不懂的童鞋,就看看代码吧:
#include<cstdio>
#include<cmath>
#include<cstring>
#include<algorithm>
using namespace std;
struct ill{
int x,y;
}p[101][5];
int n,plane,A,B,train[101];
double ways[405][405];
void chu(int f)
{
int i,j;
for(i=1;i<4;i++)
for(j=i+1;j<=4;j++)
ways[(f-1)*4+i][(f-1)*4+j]=ways[(f-1)*4+j][(f-1)*4+i]=sqrt(pow(p[f][i].x-p[f][j].x,2.0)+pow(p[f][i].y-p[f][j].y,2.0))*train[f];
}
void find(int f)
{
int i,j,k=0,z;
double l[4];
for(i=1;i<=2;i++)
for(j=i+1;j<=3;j++)
{
l[6-i-j]=sqrt(pow(p[f][i].x-p[f][j].x,2.0)+pow(p[f][i].y-p[f][j].y,2.0));
if(k<l[6-i-j])
{
k=l[6-i-j];
z=6-i-j;
}
}
swap(p[f][z].x,p[f][1].x);
swap(p[f][z].y,p[f][1].y);
p[f][4].x=p[f][3].x-p[f][1].x+p[f][2].x;
p[f][4].y=p[f][3].y-p[f][1].y+p[f][2].y;
}
void chu2()
{
int i,j;
for(i=1;i<=n*4;i++)
for(j=1;j<=n*4;j++)
if(!ways[i][j]&&i-j!=0)
ways[i][j]=plane*sqrt(pow(p[(i-1)/4+1][(i-1)%4+1].x-p[(j-1)/4+1][(j-1)%4+1].x,2.0)+pow(p[(i-1)/4+1][(i-1)%4+1].y-p[(j-1)/4+1][(j-1)%4+1].y,2.0));
}
void scan()
{
int i,j;
scanf("%d%d%d%d",&n,&plane,&A,&B);
for(i=1;i<=n;i++)
{
for(j=1;j<=3;j++)
scanf("%d%d",&p[i][j].x,&p[i][j].y);
find(i);
scanf("%d",&train[i]);
chu(i);
}
chu2();
}
void floyed()
{
int i,j,k;
for(k=1;k<=n*4;k++)
for(i=1;i<=n*4;i++)
for(j=1;j<=n*4;j++)
ways[i][j]=min(ways[i][j],ways[i][k]+ways[k][j]);
}
void print()
{
int i,j;
double k=1<<30;
for(i=1;i<=4;i++)
for(j=1;j<=4;j++)
k=min(k,ways[(A-1)*4+i][(B-1)*4+j]);
printf("%.2lf\n",k);
}
void over()
{
memset(p,0,sizeof(p));
memset(train,0,sizeof(train));
memset(ways,0,sizeof(ways));
}
int main()
{
int nn;
scanf("%d",&nn);
for(;nn;nn--)
{
scan();
floyed();
print();
over();
}
}
其实,遇到难题的时候,把它化成几个小问题,逐个击破,难题也就不那么难了
巨坑练习题!!!—— Car的旅行线路的更多相关文章
- 【走过巨坑】android studio对于jni调用及运行闪退无法加载库的问题解决方案
相信很多小伙伴都在android开发中遇到调用jni的各种巨坑,因为我们不得不在很多地方用到第三方库so文件,然而第三方官方通常都只会给出ADT环境下的集成方式,而谷歌亲儿子android studi ...
- 【单页应用巨坑之History】细数History带给单页应用的噩梦
前言 在我们日常的网页浏览中,我们非常喜欢做一个操作:点击浏览器的前进后退在Ajax技术出现后,有些时候前进后退就会给开发者带来困扰,甚至一些开发者试图去干掉History随着Html5的发展,移动端 ...
- bat调用bat的一个巨坑
[一个巨坑] a.bat的内容:echo 1b.batecho 2执行结果:运行a.bat时,输出1,然后调用b.bat, 但是 echo 2 显示不出来. bat怎么调用bat文件并返回? 例如主文 ...
- QJsonObject和QJsonArray的巨坑
最近用Qt的QJsonObject和QJsonArray当做类变量来存储运行信息,发现这两货真的是巨坑.让人有一种JJ fly的感觉/(ㄒoㄒ)/~~. 写了个例子来说明下: MainWindow:: ...
- better-scroll之吸顶效果巨坑挣扎中
今天和大家分享下better-scroll这款移动端用来解决各种滚动需求的插件(目前已经支持PC) 关于其中的API大家可以去官网看下 这里就给大家介绍几种常用的以及需要注意的点是什么 首先说一下b ...
- (杭电 2054)A==B?(这真是个巨坑)
A == B ? Time Limit: 1000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)Total Submi ...
- SpriteKit在复制节点时留了一个巨坑给开发者,需要开发者手动把复制节点的isPaused设置为false
根据When an overlay node with actions is copied there is currently a SpriteKit bug where the node’s is ...
- 关于代码通过API操作阿里云RDS的巨坑
由于项目原因,要通过API操作阿里云的数据库,于是简单研究了一下阿里云提供的相关文档,发现官方提供了.NET的SDK,而且还提供了github开源代码,这个要为阿里点赞! 于是到github上弄了一份 ...
- 史上巨坑: vim的"set foldmethod=syntax"设置竟然是导致ctrl+p(ctrl+n)补全在文件稍大时光标位于中间位置补全效率变慢的元凶!
最近我的vim又让我闹心了. 问题出现在supertab的补全速度上, 有时候按下tab键半天才弹出补全列表, 即便是弹出了列表在列表上下移动也变得的相当缓慢, 这让我的很是蛋疼. 在完全无法接受这个 ...
随机推荐
- 托管exe文件的加载和执行
托管exe文件被启动的时候,首先被PE Loader载入.PE Loader载入exe文件之后,会分析PE文件头的data directory table,如果CLR_Header内的值不为0,表示该 ...
- P4556 [Vani有约会]雨天的尾巴 (线段树合并)
P4556 [Vani有约会]雨天的尾巴 题意: 首先村落里的一共有n座房屋,并形成一个树状结构.然后救济粮分m次发放,每次选择两个房屋(x,y),然后对于x到y的路径上(含x和y)每座房子里发放一袋 ...
- 阿里云 CentOS8 Repo
# CentOS-Base.repo # # The mirror system uses the connecting IP address of the client and the # upda ...
- Qt configure 参数说明(中文)
Qt configure 在编译QT前,可加各种参数来定制自己想要的QT库.这对需要裁减QT库的朋友来说非常重要.对于如何编译QT,可以参考:http://hi.baidu.com/agassi%5F ...
- keil中使用_at_绝对地址定位问题
最近在做51单片机的时候,看到程序中某头文件有这样一段: 其中,_at_的作用就是将变量限定存放在指定的RAM空间.比如在这个单片机头文件中,就是将变量P00F,P01F分别存到Addr(0x8000 ...
- Kafka2.4发布——新特性介绍(附Java Api Demo代码)
新功能 允许消费者从最近的副本进行获取 为 Consumer Rebalance Protocol 增加对增量协同重新均衡(incremental cooperative rebalancing)的支 ...
- Spring注解之@Autowired、@Qualifier、@Resource、@Value
前言 @Autowired.@Qualifier.@Resource.@Value四个注解都是用于注入数据的,他们的作用就和在xml配置文件中的bean标签中写一个标签的作用是一样的!本篇中特别要讲解 ...
- rest_framework框架之认证功能的使用和源码实现流程分析
rest_framework框架之认证的使用和源码实现流程分析 一.认证功能的源码流程 创建视图函数 Note 创建视图函数后,前端发起请求,url分配路由,执行视图类,视图类中执行对应方法必须经过d ...
- vue-awesome-swiper手动滑动后不再自动轮播的问题
<swiper :options="swiperOption" ref="mySwiper" > <!--轮播图内容--> </s ...
- 【题解】SDOI2015序列统计
[题解]SDOI2015序列统计 来自永不AFO的YYB的推荐 这里是乘积,比较麻烦,不过由于给定的序列膜数是个小质数,所以可以\(O(m^2\log m)\)找原跟(实际上不需要这么多). 乘积有点 ...