本文由 楊珏成 原創發佈於 SegmentFault,未經許可請勿轉載
原文連接: https://segmentfault.com/a/11...
我就讀於北京理工大學軟件工程專業,是一名大四學生。從大一開始投入之前端爲主的全棧開發,獨立開發過多箇中型和小型項目,是 佬鐵|宿舍市集 小程序的社區創始人及獨立項目負責人。php
在學校裏讀書的時候,我就是一個閒不住的人。最近由於一個偶然的契機,接觸到了校招季,最後定下了本科畢業就工做的規劃目標。css
因而我在一個月的時間裏參加了9家國內大廠校招,收穫了以下結果(截至2019年9月5日):html
從一開始手指冒汗被懟的說不出話,到最後和麪試官侃侃而談遊刃有餘,我發現:一樣的能力水平,在不一樣的面試表現下,反饋到面試官眼中的結果能夠有着天壤之別。前端
所以,若是你但願把本身的真實水平展現給面試官,那麼掌握一些合適的方法是很是有必要的。vue
正文的內容聚焦於應聘大廠校招所需具有的能力,以及分析各個大廠具體的校招策略。分爲兩個部分:node
但願能爲第一次走上職場的同窗們提供參考,也是對本身過去數週奔波忙碌的一個總結。python
想要拿到offer,第一步天然是經過大廠的校招初篩。在初篩,尤爲是大廠的初篩環節中,面試官面對的將是成千上萬份看起來沒什麼區別的簡歷文件。想要脫穎而出,你必須以對待工程項目的態度精心設計你的簡歷。mysql
就像web開發的layout,寫簡歷時也應該考慮本身的簡歷layout。怎樣劃分簡歷內容板塊,我的信息是居中仍是居左,頭像應該和我的信息一塊居中仍是和我的信息對稱放置。react
這裏比較玄學,個人建議是參考身邊學長或者hr發的簡歷模板。jquery
這點是簡歷構建中最重要的,寫簡歷切忌一股腦把本身的驕傲倔強都寫上去,這樣只會讓面試官不知道這我的想要表達什麼。
建議先把本身的驕傲倔強所有整理成一個文本庫,再根據應聘的不一樣職位精心挑選出最對口的內容。
這裏推薦一個技術簡歷的最佳實踐:
我在附錄3
裏附上了本身的求職簡歷,供感興趣的同窗查看
亮點也是一個玄學,由於亮點是由面試官決定的,也許你的面試官恰巧和你同樣喜歡攝影 / 爬山 / ……,有可能他正好從你的一段項目經歷中看到了你的我的魅力,而另外一個面試官卻對此毫無感觸。
可是就像美國大片總能打動絕大部分觀衆的心裏,簡歷的亮點也是能夠設計的,這裏依然是建議多參考一些優秀的簡歷進行學習。
有的時候會發簡歷到HR或者內推人的郵箱,很容易忽視郵件的格式細節。
簡單歸納,一封簡歷郵件須要有明確的郵件標題以及表現本身誠意的正文,不要小看這一句話,看看滴滴在打車時的推薦問候語就知道一句問候的價值了。
千萬不要留空,印象分會減不少。
這裏推薦一個我本身的最佳實踐:
這點能夠說的不少也不多。可能是由於筆試題型太多了,一道道講不完。少是由於筆試不一樣於面試,筆試是全部人統一題目,所以目的和簡歷初篩是同樣的,都是爲面試官快速篩選提供幫助。
有的公司還會在筆試以後再開始初篩。甚至有些狀況下(好比內推)是能夠免除筆試的,所以這裏不作贅述。
筆試沒有什麼竅門,惟一的辦法就是刷題庫,推薦 Leetcode。要是能刷100道基本上面試題就不用愁,要是刷到200道就不用害怕校招筆試了。
我在附錄2
中記錄了本身遇到的一些筆試題,僅供參考。
任何人在第一次面對面試官的時候都會緊張,即便我經歷這麼多場面試,依然會在有的時候感受控制不住本身的狀態。若是你能克服這種緊張,你就已經比多數面試者成功了一小半。記住,面試官永遠都喜歡你臨危不亂,面對難題依然可以掌握大局的樣子。在之後任何場合都是如此。
如何克服緊張,我這裏提供兩點建議
面試的時候,面試官老是喜歡出一些看起來很刁難的問題:實現一個Vue雙向綁定,寫一個公平的洗牌算法,寫一個css走馬燈樣式,獲取某個字符串的全排列,寫一個class的polyfill等等。
或者是深挖你的項目經歷一步步追問技術細節,讓你現場考慮如何實現更好的效果。
這種時候,你要意識到面試官是在考驗你的邏輯思惟,面試官的目的不是要你給出一個絕對完美的解決方案,而是想看到你如何運用一套好的邏輯思惟來調用本身的知識庫,最終給出你本身的思考路徑,最重要的是這個過程當中間的思考,必定要闡述給面試官。
重點來了!如下是整個面試中90%時間在乾的事情,也就是對你的技術儲備與工程能力的考覈。
通常來講,大廠的前端校招會比其餘中小企業更看重對面試者的全方位考覈,若是你是科班出身,校招的技術考覈會包括且不限於:
另外,不一樣的大廠也有不一樣的側重點。
技術實力最頂尖的阿里淘系FED會對你的基礎知識體系以及你簡歷上寫到的技能展開一場慘絕人寰的刨根問底,而字節跳動則更看重你的實際工程經驗以及對於軟件系統架構的理解。
經過每家大廠的面試策略,你也能夠側面觀察出這家企業的團隊技術實力和業務發展前景。
爲了更清晰的描述大廠校招知識體系,我將考覈中涉及到的全部面試題整理成了一張思惟導圖。建議一條一條仔細查閱,對於任何沒有百分百把握的知識點,我都建議你把它整理到一個列表裏,逐條梳理。
PS.標星的是非必須知識,能夠略過:
若是你經過了以上全部考覈的話,恭喜你,你離得到offer基本只剩一步之遙了。
通常到這個時候,面試官會問你對本身的職業規劃,千萬不要小看這個問題。
這個問題其實也是須要本身問題本身的,最好在投遞簡歷的時候就想清楚:
仍是那句話 —— 不想當架構師的前端不是好程序員(霧)。
這點就不用多說了,現場面試最好一齣場就開始回憶面試流程&寫備忘錄,若是是電話面試能夠錄音下來重聽一邊,捋一捋面試官的問題和本身的回答,看看本身答得如何(答成了什麼b樣),有沒有可能答得更好。沒有這點,你參加再多的面試也和沒有參加同樣。
我在附錄1
中記錄了每次參加校招時的覆盤。
這裏原本想仔細量化評測一下各家大廠面試流程中的面試體驗,遺憾的是有些面試已通過去一段時間了,印象不是那麼清晰,我擔憂個人評價會有失偏頗。因此就簡單說一下在各家面試過程當中讓我印象深入的一些事情吧。
# 6.8 阿里校招二面
)最近看到一篇文章《前端深水區》感觸頗深,技術崗的最終出路必定是創建技術壁壘和影響業務決策。
在面試B站的時候,也遇到了一個讓我陷入了思考的問題,面試官當時問我:「我對你的職業規劃印象很好,你打算怎樣去實現它呢?我給你一分鐘的時間仔細思考這個問題。」
最後我回答了他三句話:
與你們共勉。
符號 | 含義 |
---|---|
√ | 現場回答正確 |
× | 現場回答錯誤 |
? | 現場沒法判斷是否答對 |
追問 | 對於父問題的追問 |
() | 我在面試現場的回答思路 |
()右邊 | 最合適的回答(或對現場回答的補充) |
補充 | 面試官親自對現場回答的補充 |
問 | 我向面試官提出的問題 |
PS. 並非全部試題都包含以上符號,由於都是現場回憶記錄,因此有不少不全的地方。
方法調用模式this指向 ×
什麼是VueX √(狀態量跨組件管理)
rpx是什麼 √
不考慮還有別的辦法 √
html
如何在移動端處理兼容性 ?(css前綴)
canvas如何使用圖層 √
css
實現響應式佈局的方法 √ (flex 媒體查詢 rem)
js
js全部基礎類型 ?(布爾值,數字,字符串)還有null和undefined,symbol
js當中對於不一樣環境的變量何時釋放 √(標記清除和引用計數)
js裏的多重繼承怎麼實現 √(call,es6 extend)
你的小程序是怎樣一個軟件(校內交易社區)
你的小程序用openid去登錄,能夠講一下OAuth流程嗎(可信平臺對前端發放token,後端處理敏感信息)
你的小程序Websocket通訊系統是作什麼的(各類類型消息的實時通訊)
你的搜索爲何用Elastic Search(中文分詞,倒排索引,高效)
你的數據庫用的是什麼引擎(INNODB)
你的用戶密碼是怎麼存在數據庫裏的(PASSWORD函數)
你有沒有作登錄態持久化,怎麼作的(設置cookie過時時間)
在中航通用實習的主要成果(獨立開發web系統,數據控制檯,後端服務器)
你是怎麼統計頁面數據的 √
視差屏原理 √
如何實現事件監聽√ (callback,addEventListener)
畫一個盒模型√
www.toutiao.com
轉爲com.toutiao.www
√輸入:[1, 2, [3, 4], 5, 6, [7, 8], 9] 輸出: [[3, 4, 1, 2, 5, 6][7, 8 ,9]]
輸入:contentType 輸出:content_type
給我看看你上線的小程序√
你的websocket是幹什麼的√
坑點:沒有準備耳機,視頻面試官聲音比較小,一開場亂了節奏
性能上面作過優化效果最好的×××(懶加載,預加載)
這兩個是你認爲最明顯的嗎×××(嚴重失誤,忘記說重繪和迴流以及防抖和節流,瀏覽器緩存,代碼壓縮,異步加載等等)
小明和小紅用字符串壓縮通訊。
字符串壓縮規則是:若是有連續重複的字符串好比ABCABCABC就縮寫成[3|ABC]。
現有壓縮後的字符串,設計一個解壓程序還原字符串。
輸入: HG[3|B[2|CA]]F 輸出: HGBCACABCACABCACAF
須要優化內存,我之因此87.5就是由於內存溢出MLE了,正在考慮用棧結構重寫一次。
string decode(string s) { string res = "", ans = ""; int len, start , end; int time, counting; time = 0, counting = 1; len = s.size(); for (int i = 0; i < len; i++) { if (s[i] == '[') { start = i; for (i = len; s[i] != ']'; i--); end = i; res += decode(s.substr(start + 1, end - start - 1)); i++; } if (counting && s[i] >= '0' && s[i] <= '9') { time = time * 10 + (s[i] - '0'); } else if (s[i] == '|') { counting = 0; } else { res += s[i]; } } char tmp = res[res.size() - 1]; if (tmp == '\0') { res = res.substr(0, res.size() - 1); } if (time > 0) { for (int i = 0; i < time; i++) { ans.append(res); } } else { ans = res; } return ans; } int main() { string s; cin >> s; cout << decode(s) << endl; return 0; }
判斷一個ip地址是否是私有的
已知私有IP範圍是:
10.0.0.0 - 10.255.255.255 172.16.0.0-172.16.255.255 192.168.0.0-192.168.255.255 127.0.0.0/8 # 注意!這裏是一個巨坑,0/8的意思表明子網掩碼255.255.255.0,也就是最後8位能夠有動態範圍,這是一種簡寫方法,可是騰訊並無說明其含義,可能也是一處考察。
輸入: 0.0.0.0 輸出: false
function isPrivate(ip){ // TODO let ipVal = ip.split('.'); ipVal[0] = Number(ipVal[0]); ipVal[1] = Number(ipVal[1]); ipVal[2] = Number(ipVal[2]); ipVal[3] = Number(ipVal[3]); if (ipVal[0] == 10) { if (ipVal[1] >= 0 && ipVal[1] <= 255) { if (ipVal[2] >= 0 && ipVal[2] <= 255) { if (ipVal[3] >= 0 && ipVal[3] <= 255) { return true; } } } } if (ipVal[0] == 172) { if (ipVal[1] >= 16 && ipVal[1] <= 31) { if (ipVal[2] >= 0 && ipVal[2] <= 255) { if (ipVal[3] >= 0 && ipVal[3] <= 255) { return true; } } } } if (ipVal[0] == 192) { if (ipVal[1] == 168) { if (ipVal[2] >= 0 && ipVal[2] <= 255) { if (ipVal[3] >= 0 && ipVal[3] <= 255) { return true; } } } } if (ipVal[0] == 127) { if (ipVal[1] == 0) { if (ipVal[2] == 0) { if (ipVal[3] >= 0 && ipVal[3] <= 8) { return true; } } } } return false; }
把一個由 - 或 _ 或 @ 鏈接的變量詞組轉換成駝峯寫法
輸入: content-type 輸出: contentType
function camel(str) { // TODO let ans = ""; let upper = false; for (let index = 0; index < str.length; index++) { const element = str[index]; if (element == '_' || element == '-' || element == '@') { upper = true; } else { if (upper) { ans += element.toUpperCase(); } else { ans += element; } upper = false; } } return ans; };
企鵝星球上一天有N(<200000)個小時(時間不包含0點),對應N個時區,當第1時區一點的時候第2時區已經兩點了,以此類推
每一個時區有Ai我的,每一個時區上的人只有在[u,v)時間內有空,如今想要讓儘量多的人開會,給出開會時第一時區的時刻
輸入: 3 2 5 6 1 3 輸出: 3
時區的對應有一點繞,我一開始理解成後一個時區比前一個時區落後,其實是超前的,每後一個時區比前一個時區快1個小時,解決掉這個問題就沒有大問題了。
另外要考慮一下時間複雜度的問題,個人優化比較差,最壞複雜度是O(n2/2)
int main() { int n, u, v, len, pos; long long ans, tmp; cin >> n; vector<int> a(n, 0); for (int i = 0; i < n; i++) { cin >> a[i]; } cin >> u >> v; u--; v--; len = v - u; pos = 0; if (len < n / 2) { ans = 0; for (int i = 0; i < n; i++) { tmp = 0; for (int j = 0; j < len; j++) { tmp += a[(i + j) % n]; } if (tmp > ans || (tmp == ans && ((n + u - pos) % n < (n + u - pos) % n))) { ans = tmp; pos = i; } } } else { ans = INF; for (int i = 0; i < n; i++) { tmp = 0; for (int j = 0; j < n - len; j++) { tmp += a[(i + j) % n]; } if (tmp < ans || (tmp == ans && ((n + u - pos) % n < (n + u - pos) % n))) { ans = tmp; pos = i; } } } cout << (n + u - pos) % n + 1 << endl; return 0; }
第一題的思路比較簡單,就是展轉相除法,用字符串存儲大數,而後分段展轉相除
展轉相除法:假若有兩個正整數p1,p2,其中p1>p2,那麼必然存在兩個天然數k,b,使得p1=k*p2。
若是p1,p2的最大公約數是p3,那麼p2,b的最大公約數也是p3。
例如gcb(55,30)=gcb(25,30)=gcb(25,5)
題目:在一個最大長度200000的數組中,分別求出長度從1到n的子序列中最大值的最小值
輸入: 6 1 8 7 5 4 2 輸出: 1 4 5 7 8 8
簡單來講,就是把一個數組進行連續子序列的劃分,從長度爲1的子序列開始劃分,每次劃分子序列後,求出每一個子序列的最大值,再求出全部這些最大值中最小的那個,一直到長度爲n的子序列(序列自己)。
這題一開始把我看繞了,其實就是一道標準的DP題,然而我最後作的這題,考完才寫出來。。。此次筆試基本是按照最差的答題順序來的,估計跪了。
狀態轉移方程能夠這樣想出來:
設dp[j][i]
是從數組第j
個數字開始的長度爲i
的子序列的最大值,當長度i=0(實際長度應該爲1,從0開始方便些)時,dp[j][0]
等於數字自己num[j]
,從i=1開始,dpj的長度等於MAX(dp[j][i-1], dp[j+1][i-1])
也就是先後相鄰的兩個長度爲i-1的子序列最大值中的最大值。
這題要求的是同一劃分長度下全部最大值的最小值,因此在計算dp數組的同時還要計算這個值是否爲當前劃分長度的最小值,因而定義一個min數組,長度100000,先初始化成最大數值,每次計算dp[j][i]
的時候與min[i]
比較哪一個值更小,一趟下來就能獲得最小值了。
#include <stdio.h> #include <stdlib.h> #include <math.h> #include <string.h> #include <algorithm> #define MAX(x,y) ((x) > (y) ? (x) : (y)) #define INF 0x7FFFFFFF using namespace std; int num[100000] = { 0 }; int (*dp)[100000]; int main() { int n; int min[100000] = { 0 }; scanf("%d", &n); dp = (int (*)[100000])malloc(n * 100000 * sizeof(int)); for (int i = 0; i < n; i++) { scanf("%d", &num[i]); min[i] = INF; } for (int i = 0; i < n; i++) { for (int j = 0; j < n - i; j++) { if (i == 0) { dp[j][0] = num[j]; } else { dp[j][i] = MAX(dp[j][i - 1], dp[j + 1][i - 1]); } if (dp[j][i] < min[i]) { min[i] = dp[j][i]; } i = i; } } for (int i = 0; i < n; i++) { if (i>0) { printf(" "); } printf("%d", min[i]); } printf("\n"); return 0; }
一個數組中,奇偶數可互換,求任意次互換後字典序最小的數組序列。
我的思路:沒有特別好的想法
給定一個長度M(<=100000)的數組,而後輸入N(<=100000)個整數,每次將數組中全部大於等於該整數的元素減一,並輸出改變了多少個元素,要求時間性能小於1s。
用二分查找結果70%結果都TLE了,通過分析認爲主要是遍歷數組進行減一的操做太費時間(O(n^2)的複雜度)後來考慮用一個數組儲存更新過的下標分界位置來繞過遍歷減一的環節,然而沒寫完。
給定暑假時間X天(<=1000),遊戲數量N個(<=11),接下來N行給定每種遊戲須要花費的天數(Ai),以及通關該遊戲帶來的成就點數(Bi),求:在暑假X天裏可以達成的最高成就點數。
#include <iostream> #include <vector> #include <cassert> #include <algorithm> using namespace std; // 須要填充一個容量爲X的揹包,使得成就點數最大 class Knapsack01 { private: vector<vector<int>> memo; // 用 [0...index]的物品,填充容積爲c的揹包的最大價值 int bestValue(const vector<int> &w, const vector<int> &v, int index, int c) { if (c <= 0 || index < 0) return 0; if (memo[index][c] != -1) return memo[index][c]; int res = bestValue(w, v, index - 1, c); if (c >= w[index]) res = max(res, v[index] + bestValue(w, v, index - 1, c - w[index])); memo[index][c] = res; return res; } public: int knapsack01(const vector<int> &w, const vector<int> &v, int C) { assert(w.size() == v.size() && C >= 0); int n = w.size(); if (n == 0 || C == 0) return 0; memo.clear(); for (int i = 0; i < n; i++) memo.push_back(vector<int>(C + 1, -1)); return bestValue(w, v, n - 1, C); } }; int main() { // X爲暑假天數,N爲遊戲數量 int X, N; cin >> X >> N; int w, v; // vs存的是價值(成就點數) // ws存的是每一件物品的重量(天數) vector<int> vs, ws; for (int i = 0; i < N; i++) { cin >> w >> v; vs.push_back(v); ws.push_back(w); } cout << Knapsack01().knapsack01(ws, vs, X) << endl; return 0; }
PS.這題我特麼寫成徹底揹包了,實際上是01揹包,結果只對50%。
輸入指令集長度M和指令操做長度N 接下來輸入M個指令(字符串)=》指令值(字符串)的映射關係 而後隨機輸入N個指令,要求輸出對應指令值。
最簡單的用c++ map容器,然而忘記map寫法,耽誤大量時間,超級遺憾。
#include <iostream> #include <string> #include <map> using namespace std; int main() { map<string, string> ops; int x, y; cin >> x >> y; for (int i = 0; i < x; i++) { string a, b; cin >> a >> b; ops[a] = b; } for (int i = 0; i < y; i++) { string op; cin >> op; cout << ops[op] << endl; } }
給定N塊錢,M種水果,每種水果價格Pi,其中有X種特別喜歡的水果,給定不一樣水果喜歡程度的排序,並要求排序靠前的水果購買量不得小於靠後的,求全部把錢花光的可能性,結果對10000007取模。
跪了...
小明定了n個鬧鐘,他只能在鬧鐘響起時出發去學校,每一個鬧鐘時間分別爲hi點mi分,小明家到學校要x分鐘,學校上課時間a點b分 (0-24小時,0-59分鐘),求他最晚幾點起
輸入: 3 //定了幾個鬧鐘 5 0 //第1個鬧鐘的小時數和分鐘數 6 0 //第2個鬧鐘的小時數和分鐘數 7 0 //第3個鬧鐘的小時數和分鐘數 59 //到學校要多少分鐘 6 59 //上課的小時數和分鐘數 輸出: 6 0 //最晚的起牀時間
純智障思路,自定義結構體存儲鬧鐘時間,所有輸入後對鬧鐘時間從晚到早排序,接下來從前日後遍歷鬧鐘時間,計算從當前時刻出發到學校的時間,輸出第一個可以到達學校的,因爲算法很粗劣,很明顯被卡邊界了,沒時間管了直接看下一題。
struct Time { int h; int m; friend bool operator < (Time a, TIme b){ if(a.h == b.h){ return a.m > b.m; } return a.h > b.h; } } int main() { int n, x, a, b, rest; cin >> n; Time* time = (Time*)malloc(n * sizeof(Time)); for (int i = 0; i < n; i++) { cin >> time[i].h >> time[i].m; } sort(time, time + n); cin >> x; cin >> a >> b; for (int i = 0; i < n; i++) { rest = 0; if (time[i].h < a || time[i].h == a && time[i].m < b) { rest = (a - time[i].h) * 60 + b - time[i].m; if (rest >= x) { cout << time[i].h << ' ' << time[i].m << endl; break; } } } return 0; }
小明和小紅採用密碼加密通訊,每次通訊有固定的明文長度n和加密次數k。
好比:密碼二進制明文是1001010,加密次數是4,則每次將密文右移1位與明文作異或操做,總共位移3次(k=4, 因此k - 1 = 3)
輸入: 7 4 // n k 1110100110 //密文 輸出: 1001010 //明文 解釋: 1001010--- -1001010-- --1001010- ---1001010
加密次數爲4,故對於明文右移4-1=3輪,每輪與當前密文進行一次異或,故1001010對應密文爲1110100110
一道標準的異或數學題,不知道該怎麼歸類,有一點考數學的感受,看幾眼就能看出規律了直接上代碼
簡單講一下思路:
首先密文和明文第1位是同樣的,看一下上方樣例裏的解釋就懂了。
而後考慮第2到k-1位,能夠發現這一段的每一位都是由前一位密文的異或結果再與當前位明文異或獲得的。
接下來考慮第k到n-1位,觀察規律能夠發現這一段的每一位都是由前一位密文與第i-k位明文異或獲得的結果再與當前位明文異或獲得的。
如何消除異或影響你們應該都能理解,所以只要把參與異或的部分再與密文異或一下便可獲得明文。
int main() { int n, k, tmp; string s,ans=""; cin >> n >> k; cin >> s; ans += s[0]; for (int i = 1; i < k; i++) { tmp = (int)(s[i] - '0') ^ (int)(s[i - 1] - '0'); ans += tmp + '0'; } for (int i = k; i < n; i++) { ans += (int)(s[i] - '0') ^ (int)(s[i - 1] - '0') ^ (int)(ans[i - k] - '0') + '0'; } cout << ans; return 0; }
王大錘要給員工發工資,員工從左到右坐成一排,每一個員工知道彼此的資歷,每一個員工只知道本身左右員工的工資,若是某員工比左邊或右邊的人資歷老,那他必定比這我的工資高100元,每一個人最低工資100元,求王大錘最低給多少工資。
輸入: 4 //幾個員工 3 9 2 7 //員工順序以及對應的資歷 輸出: 600 //100元,200元,100元,200元 6 1 2 3 4 5 6 2100 //100,200,300,400,500,600 5 1 1 1 1 1 500 //100,100,100,100,100 8 1 2 3 4 3 2 3 4 1800 //100 200 300 400 200 100 200 300 8 3 4 3 4 3 4 3 4 1200 //100 200 100 200 100 200 100 200 5 1 2 3 4 1 1100 //100 200 300 400 500
廣度優先搜索,能夠把員工序列看做一棵多根樹,每一個工資最低的員工就是根節點,一個員工的工資其實就是他在多根樹裏的深度,
首先在輸入的時候找到比左右資歷都年輕的員工入隊,每次從隊列pop一個員工,而後判斷該員工的最小工資,而後判斷左右員工是否能夠入隊,直到全部員工出隊
int main() { int n, now; long long ans = 0; cin >> n; if (n == 0) { cout << 0 << endl; return 0; } vector<int> epy(n, 0), depth(n, 0); queue<int> sal; for (int i = 0; i < n; i++) { cin >> epy[i]; if (i > 1 && epy[i - 1] <= epy[i - 2] && epy[i - 1] <= epy[i]) { depth[i - 1] = 1; sal.push(i - 1); } } if (epy[0] <= epy[1]) { depth[0] = 1; sal.push(0); } if (epy[n - 1] <= epy[n - 2]) { depth[n - 1] = 1; sal.push(n - 1); } while (!sal.empty()) { now = sal.front(); int left = (now > 0 && epy[now-1] < epy[now]) ? depth[now - 1] : 0; int right = (now < n - 1 && epy[now + 1] < epy[now]) ? depth[now + 1] : 0; sal.pop(); if (depth[now] == 0) { depth[now] = max(left, right) + 1; } //left if (now > 0 && depth[now - 1] == 0 && (now == 1 || epy[now - 2] > epy[now - 1] || depth[now - 2] > 0)) { sal.push(now - 1); } //right if (now < n - 1 && (depth[now + 1] == 0) && (now == n - 2 || epy[now + 2] > epy[now + 1] || depth[now + 2] > 0)) { sal.push(now + 1); } } for (auto salary : depth) { ans += salary; } cout << ans * 100 << endl; }