時間:2020年5月20日-2020年6月28日ios
地點:線上c++
這個活動當時是華工幫忙推廣,因此華工的同窗推薦給我了,很是感謝那位同窗。面試
入營筆試有三道題,只作出了兩道題,沒有把題目記錄下來有點惋惜。shell
最後一題是一個規劃問題:數組
記憶中大概是,蛋糕店有任務要完成N個蛋糕,剛開始有m臺生產機器和k個工人,天天能夠生產的蛋糕爲生產機器數*工人數。學習
天天生產的蛋糕能夠保留也能夠換取生產機器和人力,兌換規則爲一個生產機器或者一個工人須要p個蛋糕。spa
問最短多少天能夠完成生產任務?插件
輸入:N m k pcode
輸出:天數圖片
我當時大概的思路是這個樣子的,由(n-m)(n+m)<n*n能夠獲得,咱們要儘可能保證生產機器和工人數量儘量接近。
其次考慮成本的話,咱們要決定用不用蛋糕換取勞動力,而這裏就是我沒有想清楚的地方,最後只能不考慮成本混過一些樣例。
由於實在忘了,也不知道題目是否是我記得的這樣,就不補題了。
入營通知我其實一開始是沒有收到的,是到時間點了我也沒有收到refuse我纔去翻了一下個人垃圾箱,結果然的是在垃圾箱裏。我以前有一次騰訊筆試的通知也被當成騷擾短信攔截了。因此之後仍是要本身翻一下,智能攔截一點也不智能。(\~^~)/
Android插件化/熱修復技術介紹
IOS逆向/破解方向技術介紹
都是介紹性的知識居多,因此訓練營結束後還要下來好好學習。
此次訓練營的過程當中主要看的就是《第一行代碼》了。
項目大做業就是作一個類手機相冊,能夠瀏覽縮略圖、查看大圖、編輯圖片、保存/刪除圖片、局域網傳輸圖片。
我負責的是編輯圖片這一塊,就是旋轉、裁剪、塗鴉。塗鴉這一塊我只經過重寫ImageView實現了繪製的基本功能,還不能擦除、不能改變畫筆大小、顏色什麼的。
定一個小目標就是我想要把這個功能繼續完善了。
此次訓練營過程當中,還share了一道字節的筆試題:
Q1—尋寶之旅
問題描述
小明得到了一張由n行m列矩陣構成的藏寶圖,在這張網格地圖上有一部分格子中標明瞭鑽石的數量(1~9),其餘格子均是障礙物不可到達。已知小明能夠從任意一個含有寶藏的格子出發,每次沿着上下左右之一的方向走一格,但不能走到障礙格中,也不能重複通過一個寶藏格,而後把沿途通過的鑽石都撿起來。他如今須要制定一條路線,使得根據這個路線前後順序排列鑽石數組成的數字最大。請幫忙找出這個最大的數字。
輸入格式
- 第一行輸入N和M, 分別表示藏寶圖矩陣的行和列, 2<N,M<20
- 接下了N行,每行輸入M個數字c,空格隔開, 0≤c<10
輸出格式
返回整數m,表示最大數字
輸入樣例
5 6 0 0 0 0 0 0 0 7 8 9 4 0 0 2 3 7 0 0 0 4 5 0 0 0 0 0 0 0 3 2
- 輸出樣例
872453794
數據範圍
- 2<N,M<20
一開始看到題腦子裏就是並查集找最大集合而後BFS從最大數開始遍歷,仔細一想,才發現大錯特錯,那就只能DFS+BFS+剪枝了。
#include <vector> #include <string> #include <iostream> using namespace std; #define N 23 #define M 23 int graph[N][M]; bool vis[N][M],visBfs[N][M]; int direct[4] = {1,0,-1,0}; string temp,ans; /*******************************圖展現*******************************/ void showGraph(int n, int m, bool flag = true){ for(int i=0; i<=n+1; i++){ for(int j=0; j<=m+1; j++){ if(flag) cout<<graph[i][j]<<' '; else cout<<vis[i][j]<<' '; } cout<<endl; } } /*******************************圖展現*******************************/ inline bool strCompare(string a,string b){ unsigned long lena = a.length(); unsigned long lenb = b.length(); return lena<lenb || (lena==lenb && a<b); } int getResBfs(int i, int j){ int len = 0; vector<int> q; q.push_back(i*25+j); while(!q.empty()){ int x = q.back(); int y = x % 25; x /= 25; q.pop_back(); for (int k=0; k<4; k++) { int n = x+direct[k]; int m = y+direct[(k+1)%4]; if(graph[n][m]!=0 && vis[n][m]==0 && visBfs[n][m]==0){ visBfs[n][m] = 1; q.push_back(n*25+m); len ++; } } } return len; } void dfs(int i, int j){ /*******************************未剪枝*******************************/ // cout<<temp<<' '<<ans<<endl; /* if(strCompare(ans, temp)) ans = temp; else {} for (int k=0; k<4; k++) { int n = i+direct[k]; int m = j+direct[(k+1)%4]; if(graph[n][m]!=0 && vis[n][m]==0){ vis[n][m] = 1; temp.push_back(graph[n][m]+'0'); dfs(n, m); temp.pop_back(); vis[n][m] = 0; } } */ /*******************************未剪枝*******************************/ /********************************剪枝********************************/ // cout<<temp<<' '<<ans<<endl; if(strCompare(ans, temp)) ans = temp; else { memset(visBfs, 0, sizeof(visBfs)); int resLen = getResBfs(i,j); if(resLen + temp.length() < ans.length()) return; } for (int k=0; k<4; k++) { int n = i+direct[k]; int m = j+direct[(k+1)%4]; if(graph[n][m]!=0 && vis[n][m]==0){ vis[n][m] = 1; temp.push_back(graph[n][m]+'0'); dfs(n, m); temp.pop_back(); vis[n][m] = 0; } } /********************************剪枝********************************/ } int main(){ int n,m; ios::sync_with_stdio(false); cin>>n>>m; memset(graph, 0, sizeof(graph)); ans = ""; temp = ""; for(int i=1; i<=n; i++){ for(int j=1; j<=m; j++){ cin>>graph[i][j]; vis[i][j] = 0; } } // showGraph(n,m); for(int i=1; i<=n; i++){ for(int j=1; j<=m; j++){ if(graph[i][j]!=0){ vis[i][j] = 1; temp.push_back(graph[i][j]+'0'); dfs(i,j); temp.pop_back(); vis[i][j] = 0; } } } cout<<ans<<endl; return 0; }