巨坑練習題!!! Car的旅行線路

2022-09-19 07:06:11 字數 2592 閱讀 4288

在看題目之前,請童鞋們做好心理準備╮(╯▽╰)╭

題目描述

又到暑假了,住在城市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位小數。

樣例輸入

13 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、首先,試著在直角座標系上畫乙個任意四邊形,讓我們來**規律,我也畫了乙個任意四邊形:

觀察一下,我們發現任意乙個四邊形:| x

s1- x

s2| =

| xs3- x

s4|       | y

s1- y

s2| = | y

s3- y

s4| (s1、s2、s3、s4按順序排列)

所以只要確定哪乙個是三點之間的直角點,那麼與其對應的未知點就可以用以上公式求出來~\(≧▽≦)/~

**實現實在不行的話,待會兒看樣例**吧~

2、將城市中的四個點求出之後,就直接乘以此城市的火車價,算出dis[ i ][ j ],最後在同一迴圈,判斷此邊是否賦值,如果沒有,將兩點距離算出來,直接乘以飛機** ( 兩點間距離公式:ab = sqrt( pow( x

a- x

b) + pow( y

a- y

b) ) )

3、先複習一下四種演算法——>(

點選開啟鏈結

點選開啟鏈結

)首先,car可以從a城市的任意乙個機場到b

城市的任意乙個機場,所以不確定起點終點,而第2、3、4種演算法都要確定起點,所以我們只能用floyed演算法,先來算算時間複雜度(o(n^3)(n

max=400)),明顯不會超時,所以,就要這個了!

4、最小值,由於有兩個城市,四個點,只需迴圈16次即可,找出最小的dis[ i ][ j ],沒什麼難度

5、初始化只需將每個陣列清空就行啦~\(≧▽≦)/~

好了,難點的處理就這些,還有不懂的童鞋,就看看**吧:

#include

#include

#include

#include

using

namespace std;

struct

illp[

101][5];

int n,plane,a,b,train[

101];

double ways[

405][

405];

void

chu(

int f)

void

find

(int f)

}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

()void

scan

()chu2

();}

void

floyed

()void

print

()void

over

()int

main

()}

其實,遇到難題的時候,把它化成幾個小問題,逐個擊破,難題也就不那麼難了

NOIP2001 Car的旅行線路

題目描述 點選此處 解題思路 平行四邊形相對頂點的橫座標 縱座標之和分別相等。將所有機場的座標都算出來之後,再根據題目描述連邊,從出發地的四個機場或到達地的四個機場分別做單源點最短路。實現 include include include include include include using n...

python的練習題 Python練習題

1 使用while迴圈輸入1 2 3 4 5 6 8 9 10 i 0while i 10 i i 1 if i 7 continue print i 結果 e python python python test.py1 2 求1 100的所有數的和 i 0sum 0 while i 100 i 1...

scala的練習題

建立乙個list val lst0 list 1,7,9,8,0,3,5,4,6,2 將lst0中每個元素乘以10後生成乙個新的集合 解析 lst0.map 10 將lst0中的偶數取出來生成乙個新的集合 解析 lst0.filter 2 0 將lst0排序後生成乙個新的集合 解析 lst0.sor...