保衛方案(京東2017筆試題)

2021-08-08 22:41:22 字數 1878 閱讀 7685

戰爭遊戲的至關重要環節就要到來了,這次的結果將決定王國的生死存亡,小b負責首都的防衛工作。首都位於乙個四面環山的盆地中,周圍的n個小山構成乙個環,作為預警措施,小b計畫在每個小山上設定乙個觀察哨,日夜不停的瞭望周圍發生的情況。 一旦發生外地入侵事件,山頂上的崗哨將點燃烽煙,若兩個崗哨所在的山峰之間沒有更高的山峰遮擋且兩者之間有相連通路,則崗哨可以觀察到另乙個山峰上的烽煙是否點燃。由於小山處於環上,任意兩個小山之間存在兩個不同的連線通路。滿足上述不遮擋的條件下,一座山峰上崗哨點燃的烽煙至少可以通過一條通路被另一端觀察到。對於任意相鄰的崗哨,一端的崗哨一定可以發現一端點燃的烽煙。 小b設計的這種保衛方案的乙個重要特性是能夠觀測到對方烽煙的崗哨對的數量,她希望你能夠幫她解決這個問題。

輸入描述:

輸入中有多組測試資料,每一組測試資料的第一行為乙個整數n(3<=n<=10^6),為首都周圍的小山數量,第二行為n個整數,依次表示為小山的高度h(1<=h<=10^9). 

輸出描述:

對每組測試資料,在單獨的一行中輸出能相互觀察到的崗哨的對數。 

示例1 輸入

5 1 2 4 5 3 輸出

7 解題思路:

把這一組數圍成乙個環,判斷兩個點(a、b)是否能夠通訊的方法是,這兩點之間的點是否都比這兩個點小(比a小且比b小)。看了別人的解法試著分析一下吧。。。 

我看了其他的人的想法,這一題有點像 

leetcode no84. largest rectangle in histogram

我們可以用單調遞減棧來做,以題中的例子為例 1 2 4 5 3

先考慮沒有連續重複元素的情況,接著說有重複元素的情況 

先迴圈移位,讓最大值5作為第乙個元素(why?),那麼這個時候,陣列為 5 3 1 2 4。

設結果為res=0; 

由於棧是單調遞迴棧,那麼5,3,1 依次入棧。此時棧頂元素是1。接下來要入棧的是2。2大於棧頂元素1,那麼棧頂元素1的左邊(3),右邊(2)。那麼1是可以看到3和2的,有兩對。res=2

1出棧,此時棧頂元素為3,2小於3。所以2進棧。此時棧頂元素為2。接下來要4要進棧,4大於棧頂元素2。那麼棧頂元素2可以看到左邊(3)右邊(4)。res=2+2=4。2出棧

同理,3出棧,4進棧。res=4+2=6。 

此時,棧裡面的元素只有4和5。作為一對。res=6+1=7。

有重複元素的情況下,假設 3,1(連續n個1) ,4。這n個1都能看到3和4有2*n個,而且這個n個1是可以互相看到對方,所以有cn2個。所以對數為 n*2+n*(n-1)/2。兩種元素的情況下 1(t1個1)、2(t2個2),對數為t1*t2+t1*(t1-1)/2+t2*(t2-1)/2。

#include #include #include #include #include #include #include #include #define n 10006

using namespace std;

int main()

vector::iterator it = v.begin();

while (*it != maxval)

s.push(pair(v[0], 1));

for (int i = 1; i < n; i++) else if (v[i] < s.top().first) else

if (v[i] == s.top().first) else

} }if (s.size() > 2)

long long t = s.top().second;

res += t * (t - 1) / 2;

s.pop();

} else if (s.size() == 2) else

cout << res << endl;

return 0;

}

京東校招筆試 保衛方案

時間限制 c c 語言1000ms 其他語言3000ms 記憶體限制 c c 語言65536kb 其他語言589824kb 題目描述 戰爭遊戲的至關重要環節就要到來了,這次的結果將決定王國的生死存亡,小b負責首度的防衛工作。首都處於乙個四面環山的盆地,周圍的n個小山構成乙個環,作為預警措施,小b計畫...

京東2016筆試題

我的結果,深度搜尋。考試當場小毛病沒改出來16 正確率 後來發現橫縱座標寫反了。醉了。以後再也不用xy做座標了,用row col的話就不會想歪了。include include using namespace std int dfs vector map,int x,int y,int max,in...

京東2016筆試題

2016.年4月8日7點到9點考題,兩個程式設計題,就做出這乙個了,第二個沒時間了,感覺第二個程式設計題還好,不是很難 題目大致意思就是給定乙個8 8的棋盤,給定兩個點a,b,求從a到b需要走的最短步數,並列印最短路徑。走的每一步的方向可以為左 l 右 r 上 u 下 d 左下 ld 左上 lu 右...