Car 的旅行路线——又是傻逼和傻逼题纠缠的故事

  洛谷和CodeVS 版本应该是一样的,有多组数据并且要求保留一位小数。Vijos 的版本没有多组数据,要保留两位小数。胡搅蛮缠换了两次最短路算法,终于还是做出来了。

 1 #include<algorithm>
 2 #include<iostream>
 3 #include<cstdlib>
 4 #include<cstring>
 5 #include<string>
 6 #include<vector>
 7 #include<cstdio>
 8 #include<stack>
 9 #include<queue>
10 #include<cmath>
11 #include<map>
12 #include<set>
13 using namespace std;
14 const int N=512,M=0x3f3f3f3f;
15 const double DIF=1e4;
16 struct node{
17     int x,y,cost;
18 }ap[N];
19 int n,air,sx,tx,apn,res=M,dis[N];
20 inline int dist(int x,int y){
21     return (int)(sqrt((double)((ap[x].x-ap[y].x)*(ap[x].x-ap[y].x)+(ap[x].y-ap[y].y)*(ap[x].y-ap[y].y)))*DIF);
22 }
23 int main(){
24     int T;cin>>T;
25     while(T--){
26         res=M;
27         memset(dis,0x3f,sizeof dis);
28         memset(ap,0,sizeof ap);
29
30         cin>>n>>air>>sx>>tx;sx--;tx--;
31
32         for(int i=1;i<=n;i++){
33             int t;
34             cin>>ap[apn].x>>ap[apn].y;apn++;
35             cin>>ap[apn].x>>ap[apn].y;apn++;
36             cin>>ap[apn].x>>ap[apn].y;apn++;
37             cin>>t;
38             ap[apn-3].cost=ap[apn-2].cost=ap[apn-1].cost=ap[apn].cost=t;
39             if((ap[apn-1].x-ap[apn-2].x)*(ap[apn-1].x-ap[apn-3].x)+(ap[apn-1].y-ap[apn-2].y)*(ap[apn-1].y-ap[apn-3].y)==0)
40                 ap[apn].x=0-ap[apn-1].x+ap[apn-2].x+ap[apn-3].x,ap[apn].y=0-ap[apn-1].y+ap[apn-2].y+ap[apn-3].y,apn++;
41             else if((ap[apn-3].x-ap[apn-1].x)*(ap[apn-3].x-ap[apn-2].x)+(ap[apn-3].y-ap[apn-1].y)*(ap[apn-3].y-ap[apn-2].y)==0)
42                 ap[apn].x=ap[apn-1].x+ap[apn-2].x-ap[apn-3].x,ap[apn].y=ap[apn-1].y+ap[apn-2].y-ap[apn-3].y,apn++;
43             else
44                 ap[apn].x=ap[apn-1].x-ap[apn-2].x+ap[apn-3].x,ap[apn].y=ap[apn-1].y-ap[apn-2].y+ap[apn-3].y,apn++;
45         }
46
47         for(int i=0;i<apn;i++)
48             if(i/4!=sx)
49                 for(int j=0;j<4;j++)
50                     dis[i]=min(dis[i],dist(i,sx*4+j))*air;
51         for(int i=0;i<4;i++)dis[sx*4+i]=0;
52
53         queue<int> q;
54         for(int i=0;i<4;i++)q.push(sx*4+i);
55
56         while(!q.empty()){
57             int x=q.front();q.pop();
58             for(int i=0;i<apn;i++)
59                     if(i/4==x/4){
60                         if(dis[i]>dis[x]+dist(x,i)*ap[i].cost){
61                             q.push(i);
62                             dis[i]=dis[x]+dist(x,i)*ap[i].cost;
63                         }
64                     }
65                     else
66                         if(dis[i]>dis[x]+dist(x,i)*air){
67                             q.push(i);
68                             dis[i]=dis[x]+dist(x,i)*air;
69                         }
70         }
71
72         for(int i=0;i<4;i++)res=min(res,dis[tx*4+i]);
73         printf("%.2lf",(double)res/DIF);
74     }
75     return 0;
76 }

Method_01

  洛谷 0ms CodeVS 5ms

时间: 2024-10-05 12:47:49

Car 的旅行路线——又是傻逼和傻逼题纠缠的故事的相关文章

NOIP2001 Car的旅行路线

题四 Car的旅行路线(30分) 问题描述 又到暑假了,住在城市A的Car想和朋友一起去城市B旅游.她知道每个城市都有四个飞机场,分别位于一个矩形的四个顶点上,同一个城市中两个机场之间有一条笔直的高速铁路,第I个城市中高速铁路了的单位里程价格为Ti,任意两个不同城市的机场之间均有航线,所有航线单位里程的价格均为t. 图例   机场 高速铁路 飞机航线 注意:图中并没有 标出所有的铁路与航线. 那么Car应如何安排到城市B的路线才能尽可能的节省花费呢?她发现这并不是一个简单的问题,于是她来向你请教

Bitonic旅行路线问题

接着上一篇的动态规划问题的一道题目: 欧几里德货郎担问题是对平面给定的n个点确定一条连结各点的.闭合的游历路线问题.图1(a)给出了七个点问题的解.Bitonic旅行路线问题是欧几里德货郎担问题的简化,这种旅行路线先从最左边开始,严格地由左至右到最右边的点,然后再严格地由右至左到出发点,求路程最短的路径长度.图1(b)给出了七个点问题的解. 请设计一种多项式时间的算法,解决Bitonic旅行路线问题. 猛地一看似乎没有什么状态可言,但是如果想一下——避免重复计算这样的特点的话——任意两点之间通过

[bzoj4644]经典傻逼题

话说这道题是因为ditoly大佬无聊时候想做sb题搜索了一下"傻逼题"搜到的,刚好今天学习了线性基,在ditoly大佬的帮助下做完啦. ------------------------------------------------------------------------------ 题意:定义割操作是对于原图的一个点集,所有恰好只有一个点在集合中的边的集合,它的权值是所有边的异或和. 给定n个点,m个操作,每次向其中两个点中添加一条边,然后求一个最大的割的权值.n<=5

洛谷 【P1027】Car的旅行路线

P1027 Car的旅行路线 题目描述 又到暑假了,住在城市A的Car想和朋友一起去城市B旅游.她知道每个城市都有四个飞机场,分别位于一个矩形的四个顶点上,同一个城市中两个机场之间有一条笔直的高速铁路,第I个城市中高速铁路了的单位里程价格为Ti,任意两个不同城市的机场之间均有航线,所有航线单位里程的价格均为t. 图例(从上而下) 机场 高速铁路 飞机航线 注意:图中并没有 标出所有的铁路与航线. 那么Car应如何安排到城市B的路线才能尽可能的节省花费呢?她发现这并不是一个简单的问题,于是她来向你

BZOJ 2222: [Cqoi2006]猜数游戏【神奇的做法,傻逼题,猜结论】

2222: [Cqoi2006]猜数游戏 Time Limit: 20 Sec  Memory Limit: 259 MBSubmit: 604  Solved: 260[Submit][Status][Discuss] Description 佳佳和明明玩一个猜数游戏.佳佳想一个1~n之间的整数,明明每次可以随便猜一个数.从第二次猜测起,佳佳告诉明明本次猜测的数和上次猜测的数相比哪个更接近.B表示本次猜测的数更接近,W表示上次猜测的数更接近.如果两次猜测的接近程度一样,则既可回答B也可回答W.

【最短路】【luoguP1027】Car的旅行路线

Car的旅行路线 题目描述 又到暑假了,住在城市A的Car想和朋友一起去城市B旅游.她知道每个城市都有四个飞机场,分别位于一个矩形的四个顶点上,同一个城市中两个机场之间有一条笔直的高速铁路,第I个城市中高速铁路了的单位里程价格为Ti,任意两个不同城市的机场之间均有航线,所有航线单位里程的价格均为t. 那么Car应如何安排到城市B的路线才能尽可能的节省花费呢?她发现这并不是一个简单的问题,于是她来向你请教. 找出一条从城市A到B的旅游路线,出发和到达城市中的机场可以任意选取,要求总的花费最少. 输

洛谷P1027 Car的旅行路线

洛谷P1027 Car的旅行路线 题目描述 又到暑假了,住在城市A的Car想和朋友一起去城市B旅游.她知道每个城市都有四个飞机场,分别位于一个矩形的四个顶点上,同一个城市中两个机场之间有一条笔直的高速铁路,第I个城市中高速铁路了的单位里程价格为Ti,任意两个不同城市的机场之间均有航线,所有航线单位里程的价格均为t. 图例(从上而下) 机场 高速铁路 飞机航线 注意:图中并没有 标出所有的铁路与航线. 那么Car应如何安排到城市B的路线才能尽可能的节省花费呢?她发现这并不是一个简单的问题,于是她来

Codevs1041&amp;&amp;Vijos1119 car的旅行路线(最短路dijkstra)

Codevs1041&&Vijos1119  car的旅行路线(最短路) 题目描述 又到暑假了,住在城市A的Car想和朋友一起去城市B旅游.她知道每个城市都有四个飞机场,分别位于一个矩形的四个顶点上,同一个城市中两个机场之间有一条笔直的高速铁路,第I个城市中高速铁路了的单位里程价格为Ti,任意两个不同城市的机场之间均有航线,所有航线单位里程的价格均为t. 那么Car应如何安排到城市B的路线才能尽可能的节省花费呢?她发现这并不是一个简单的问题,于是她来向你请教.任务找出一条从城市A到B的旅游

经典傻逼题

Description 这是一道经典傻逼题,对经典题很熟悉的人也不要激动,希望大家不要傻逼.考虑一张N个点的带权无向图,点的编号为1到N. 对于图中的任意一个点集(可以为空或者全集),所有恰好有一个端点在这个点集中的边组成的集合被称为割. 一个割的权值被定义为所有在这个割上的边的异或和. 一开始这张图是空图,现在,考虑给这张无向图不断的加边,加入每条边之后,你都要求出当前权值最大的割的权值, 注意加入的边永远都不会消失. Input 输入的第一行包括一个数ID表示数据编号, 如第一组数据中的ID