百度之星演算法題目,高手們都來討論吧,附上我的解答

2021-08-23 15:19:11 字數 2786 閱讀 1069

題目如下

1. 好心的計程車司機

北京的一位計程車司機向你抱怨:城市發展太快,公路越來越多,他已經疲於計算行駛路線,於是求你開發乙個自動導航的工具。

計程車只能在公路上行駛。所有的公路都是筆直、雙向的,相交的公路視為連通(可以在交叉點處從一條公路開到另一公路上)。由於道路施工,整個城市的公路系統可能並不完全通暢。如果乘客的目的地不在公路邊,則乘客下車後要步行前往,步行路線不受公路限制。這位好心的司機還特別提出,乘客步行距離越短越好;其次,計程車行駛里程越短越好。

方便起見,用笛卡兒座標系來描述城市地圖,所有座標都在第一象限[0, 10000]的範圍內。公路寬度忽略不計。

輸入格式

第一行是乙個正整數k,代表公路條數。以下k行每行用4個非負整數描述一條公路(用空格隔開),前兩個表示公路起點的座標,後兩個表示公路終點的座標。下一行包含4個非負整數(用空格隔開),前兩個表示乘客出發點(保證在某條公路上),後兩個表示乘客目的地座標。乘客必須在出發點上車,中途不換車。任意兩條公路最多只有乙個公共點。

輸出格式

僅一行,為計程車行駛的里程數,保留一位小數(四捨五入)。

輸入樣例 例

2 2 2 10 10

10 2 2 10

3 3 9 4

輸出樣例 例

7.8

評分規則

1. 程式將執行在一台linux機器上(記憶體使用不作嚴格限制),在每一測試用例上執行不能超過1秒,否則該用例不得分;

2. 要求程式能按照輸入樣例的格式讀取標準輸入資料,按照輸出樣例的格式將執行結果輸出到標準輸出上。如果不能正確讀入資料和輸出資料,該題將不得分;

3. 本題包含20個測試點,前10組滿足k<=10,後10組滿足k<=50。每個測試點10分,共200分。

下面是我的解答:

思路如下,首先輸入的公路資料可以看成若干條線段,然後可以求出這些線段的交點,後面還有起點和終點座標,起點座標一定在這些線段上,所以可以將起點座標點和這些線段的交點構成乙個圖,接下來就是終點座標,由於終點座標不一定在這些線段上,如果不在的話可以求出終點座標到這些線段最短距離的那個點,然後將那個點也構建到圖中,這樣原問題就變成了求起點和剛才那個點最短路徑的問題。這是我的思路,附上**,高手們檢查下有沒有問題

#include #include #include #include using namespace std;

//對角線最大長度(估算)

const double maxdis = 15000;

//代表乙個點

class point

point(){}

};class path;

//代表一條公路 也就是一條線段

class line

line(){}

//判斷指定的點是否在本線段上

bool online(point pt)

else

} //計算線段到指定點的最短距離

path shortestdistance(point pt)else if((d1 + d3) == d2)else if((d2 + d3) == d1)else if((s1 + s3) < s2)else if((s2 + s3) < s1)else

return path;

} //計算兩線段間的焦點

point calcpoint(line line)else

if(line.start.x != line.end.x)else

if(!lim1 && !lim2)

}else if(lim1 && !lim2)else if(!lim1 && lim2)

if(pt.x < 0 || pt.y < 0 || !online(pt) || !line.online(pt) )

return pt;

}};//計算最短路徑 floyd演算法

vector< vector> shortestpath(vector< vector> graph)

}} }

return path;

}int main()

vectorpoints;

//計算交點

for(size_t sx = 0; sx < lines.size();sx++)

} point startpt,endpt,calpt;

cin >> startpt.x >> startpt.y >> endpt.x >> endpt.y;

//將起點放入集合

points.push_back(startpt);

double shortest = 15000;

//計算離終點最近的那個點的位置

for(size_t index = 0;index < lines.size();index++)

} points.push_back(calpt);

vector< vector> matrix(points.size());

size_t ip,jp;

//下面兩個迴圈用來 構造鄰接矩陣

for(ip = 0;ip < matrix.size();ip++)

matrix[ip] = to;

} for(ip = 0;ip < points.size();ip++)

lit++;

}if(online)

} }vector< vector> path = shortestpath(matrix);

cout.precision(2);

cout << path[points.size()-2][points.size()-1] << endl;

}

百度之星程式設計大賽題目

輸入格式 輸入的第一行只有乙個整數n,表示購置水果的組數。接下來的n行表示水果的到達時間 取走時間 時間用1200到1900之間的正整數表示,保證取走時間大於到達時間 剩下的字串以空格分割每一種水果。如 1400 1600 雪梨 水蜜桃 表示下午兩點到四點 包含兩點和四點這兩個時間點 雪梨和水蜜桃會...

百度之星 2023年 初賽題目一

題目描述 乙個正整數有可能可以被表示為n n 2 個連續正整數之和,如 15 1 2 3 4 5 15 4 5 6 15 7 8 請編寫程式,根據輸入的任何乙個正整數,找出符合這種要求的所有連續正整數序列。輸入資料 乙個正整數,以命令列引數的形式提供給程式。輸出資料 在標準輸出上列印出符合題目描述的...

百度之星 2023年 初賽題目四

第四題 共四題100 分 低頻詞過濾 40 分 題目描述 請編寫程式,從包含大量單詞的文字中刪除出現次數最少的單詞。如果有多 個單詞都出現最少的次數,則將這些單詞都刪除。輸入資料 測試corpus.txt 檔案,實際執行時我們會使用不同內容的輸入檔案。輸出資料 在標準輸出上列印刪除了corpus.t...