在看題目之前,請童鞋們做好心理準備╮(╯▽╰)╭
題目描述
又到暑假了,住在城市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...