題目如下
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...