如上圖所示,0是takahashi的住處。1,2,3,4,5是五棵樹的位置。對於每棵樹,都有逆時針和順時針兩個方向。
(1)逆時針到達第1棵樹所能經過的最大距離為0(逆時針)-> 2(順時針)-> 1,順時針到達第1棵樹所能經過的最大距離為0(順時針)-> 1。
(2)逆時針到達第2棵樹所能經過的最大距離為0(逆時針)-> 1(順時針) -> 3(逆時針) -> 2,順時針到達第2棵樹所能經過的最大距離為0(順時針) -> 3(逆時針) -> 1(順時針)-> 2。
(3)逆時針到達第3棵樹所能經過的最大距離為0(逆時針)-> 1(順時針) -> 5(逆時針)-> 2(順時針)-> 4(逆時針)-> 3,順時針到達第3棵樹所能經過的最大距離為0(順時針) -> 5(逆時針) -> 1(順時針)-> 4(逆時針) -> 2(順時針) -> 3(逆時針)。
(4)逆時針到達第4棵樹所能經過的最大距離為0(逆時針)-> 3(順時針) -> 5(逆時針) -> 4,順時針到達第4棵樹所能經過的最大距離為0(順時針) -> 5(逆時針) -> 3(順時針)-> 4。
(5)逆時針到達第5棵樹所能經過的最大距離為0(逆時針)-> 5,順時針到達第5棵樹所能經過的最大距離為0(逆時針)-> 4(順時針) -> 5。
上面計算出n * 2 = 5 * 2 = 10個距離,找出最大值即為所求。
在計算距離之前,要計算:①逆時針經過每一棵樹並返回到原點的累積距離,存到l陣列中;②順時針到達每一棵樹並返回原點的累積距離,存到r陣列中。
然後計算總距離時,哪一棵樹沒有經過,就要把相應的距離減掉。
以逆時針經過第2棵樹為例,經過的距離為x[2] + l[1]+ r[3] – 從0點到第4棵樹的往返距離 – 從0點到第5棵樹的往返距離。
具體可看下面的**。
#include typedef long long ll;
using namespace std;
int l, n, x[200000];
ll r[200001], l[200001], max;
int main()
for (int i = 0; i < n; ++i)
for (int i = n - 1; i >= 0; --i)
for (int i = 0; i < n; ++i)
else
max = max(max, cnt);
// 順時針,與逆時針情景類似
cnt = l - x[i] + l[i] + r[i + 1];
if (i <= n - (i + 1))
else
max = max(max, cnt);
} cout << max << endl;
return 0;
}
topcoder & codeforces & atcoder交流qq群:648202993
演算法題 A除以B
題目描述 本題要求計算a b,其中a是不超過1000位的正整數,b是1位正整數。你需要輸出商數q和餘數r,使得a b q r成立。輸入描述 輸入在1行中依次給出a和b,中間以1空格分隔。輸出描述 在1行中依次輸出q和r,中間以1空格分隔。輸入例子 123456789050987654321 7 輸出...
演算法題 A除以B
題目描寫敘述 本題要求計算a b。當中a是不超過1000位的正整數,b是1位正整數。你須要輸出商數q和餘數r,使得a b q r成立。輸入描寫敘述 輸入在1行中依次給出a和b,中間以1空格分隔。輸出描寫敘述 在1行中依次輸出q和r,中間以1空格分隔。輸入樣例 12345678905098765432...
演算法題目第3題(B樹,B 樹,B 樹,B 樹)
一道筆試題 記不清楚了 b 樹插入操作的平均時間複雜度為o logn 最壞時間複雜度為o n hash表插入操作的平均時間複雜度為o 1 最壞時間複雜度為o n 排序鍊錶插入操作的平均時間複雜度為o n 最壞時間複雜度為o n 紅黑樹插入操作的平均時間複雜度為o logn 最壞時間複雜度為o n 這...