時間:2020年5月20日-2020年6月28日
地點:線上
事情的起因
一、得知活動
這個活動當時是華工幫忙推廣,所以華工的同學推薦給我了,非常感謝那位同學。
二、入營筆試
入營筆試有三道題,只做出了兩道題,沒有把題目記錄下來有點可惜。
最后一題是一個規划問題:
記憶中大概是,蛋糕店有任務要完成N個蛋糕,剛開始有m台生產機器和k個工人,每天可以生產的蛋糕為生產機器數*工人數。
每天生產的蛋糕可以保留也可以換取生產機器和人力,兌換規則為一個生產機器或者一個工人需要p個蛋糕。
問最短多少天可以完成生產任務?
輸入:N m k p
輸出:天數
我當時大概的思路是這個樣子的,由(n-m)(n+m)<n*n可以得到,我們要盡量保證生產機器和工人數量盡可能接近。
其次考慮成本的話,我們要決定用不用蛋糕換取勞動力,而這里就是我沒有想清楚的地方,最后只能不考慮成本混過一些樣例。
因為實在忘了,也不知道題目是不是我記得的這樣,就不補題了。
三、入營通知
入營通知我其實一開始是沒有收到的,是到時間點了我也沒有收到refuse我才去翻了一下我的垃圾箱,結果真的是在垃圾箱里。我之前有一次騰訊筆試的通知也被當成騷擾短信攔截了。所以以后還是要自己翻一下,智能攔截一點也不智能。(\~^~)/
事情的經過
一、課程
-
Android插件化/熱修復技術介紹
-
IOS逆向/破解方向技術介紹
都是介紹性的知識居多,所以訓練營結束后還要下來好好學習。
二、自學資料
這次訓練營的過程中主要看的就是《第一行代碼》了。
三、項目
項目大作業就是做一個類手機相冊,可以瀏覽縮略圖、查看大圖、編輯圖片、保存/刪除圖片、局域網傳輸圖片。
我負責的是編輯圖片這一塊,就是旋轉、裁剪、塗鴉。塗鴉這一塊我只通過重寫ImageView實現了繪制的基本功能,還不能擦除、不能改變畫筆大小、顏色什么的。
定一個小目標就是我想要把這個功能繼續完善了。
四、筆試題share
這次訓練營過程中,還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;
}