2020位元組跳動校園招聘演算法方向第一場考試題解

2021-10-03 22:31:42 字數 3281 閱讀 6071

【題意】 給出,可以理解為a的爸爸是b,現在你要依次輸出每個爸爸的所有兒子,兒子之間按照字典序排序

【思路】 思路不難,用map將爸爸的名字對映成數字,然後建乙個二維vector,兒子push_back到對應爸爸後面,然後排序輸出即可。

【坑點】竟然有重複的,最後三分鐘才發現,有點坑啊!!!也就是a的爸爸是b這句話說了多遍,那麼vector中的元素會有重複,需要去重,當然,直接用set自動去重就行了

【思路】因為要使加油次數最少,顯然要用貪心,每次油不足以到達當前的加油站時,說明前面必須要多加一次油,要加的話肯定是加前面加油站中油量最大的那個,所以用優先佇列維護一下,每次彈出最大值即可

【**】

#include using namespace std;

typedef long long ll;

#define mst(a,b) memset((a),(b),sizeof(a))

#define rush() int t;scanf("%d",&t);while(t--)

const int maxn=1005;

const int inf=0x3f3f3f3f;

const ll mod=998244353;

int n,d,w;

int a[maxn];

string s;

int dis[maxn];

int main()

}dis[n++]=cnt;

//printf("%d\n",n);

dis[0]=0;

dis[n+1]=d;

for(int i=1;i<=n;i++) scanf("%d",&a[i]);

int ans=0;

priority_queue,less>q;

for(int i=1;i<=n+1;i++)}}

}if(w>=d) printf("%d\n",ans);

else puts("-1");

}

【思路】經典的迷宮問題,只多了乙個傳送門,隨便用什麼東西把兩個傳送門之間連線起來即可,再用bfs廣搜,每次到傳送門的時候乙個方案是向四周走,還有就是走到傳送門的另一側

但是不知道為什麼一直超時87.5,檢查了很久沒有檢查出來qaq

【ps】有dalao提醒了,應該就是因為我走通道的時候沒有vis判斷…

#include using namespace std;

typedef long long ll;

#define mst(a,b) memset((a),(b),sizeof(a))

#define rush() int t;scanf("%d",&t);while(t--)

const int maxn=205;

const int inf=0x3f3f3f3f;

const ll mod=998244353;

int n,m;

int mp[maxn][maxn];

int vis[maxn][maxn];

const int dir[4][2]=,,,};

vector>vec[maxn*maxn];

mapkk;

struct node

now,nex;

int bfs(int sx,int sy)

); //printf("%d\n",mp[0][0]);

while(q.size())

else

//printf("@@%d %d\n",nex.x,nex.y);

}for(int i=0;i<4;i++)}}

//printf("%d %d\n",sx,sy);

printf("%d\n",bfs(sx,sy));

}

【思路】題目模型就是有依賴的樹形dp(揹包),直接利用題目所給關係兩個點之間連邊,但是有可能無法構成一棵樹(若干顆分散的樹),所以引入虛節點作為樹根,將它和其他分散的樹根連線起來(當依賴點為0的時候,用0連向這個點就好)構成一棵樹就可以樹形dp了

用dp[i][j]表示以i為根,用了j個節點的最大值,然後自下向上更新

最終答案就是dp[0][m+1]

【**】

#include using namespace std;

typedef long long ll;

#define mst(a,b) memset((a),(b),sizeof(a))

#define rush() int t;scanf("%d",&t);while(t--)

const int maxn=205;

const int inf=0x3f3f3f3f;

const ll mod=998244353;

int n,m;

int val[maxn];

int dp[maxn][maxn];

vectorvec[maxn];

void dfs(int u)

}for(int i=m;i>=1;i--) dp[u][i]=dp[u][i-1]+val[u];

}int main()

m++;

mst(dp,0);

dfs(0);

printf("%d\n",dp[0][m]);

}

2020 09 06位元組跳動後端

分析 這道題我是用的動態規劃來求解,和傳統的上樓梯問題不同,它多了乙個不能連續走兩步的條件,但我認為沒什麼不同。根據題意,最後一步要麼是2要麼是1,如果最後一步是2,則要考慮不能連續走兩步的限制情況。也就是說,對於乙個已經走到n 2步的人來說,他只能由n 3步走1步得到,而不能由n 4步走兩步得到....

2019位元組跳動實習面試

位元組跳動還是依舊非常注重演算法能力,所以面試過程演算法比重依舊比較大,不知道是不是年前比較缺人的原因,這次面試一共經歷了兩面,而且難度比我去年面試抖音略簡單一下,下面是面試過程的主要題目。1.開始仍舊是常規的自我介紹,接下來重點詢問我在美團實習的經歷,待我將實習內容講解完成以後,主要問我分庫分表按...

9 6 位元組跳動筆試

大概題意 有個樓梯比較高,問有多少種可以方式可以走上去,但有特殊得要求 一是每次可以走一步或者兩步,二是不能連續的走兩步 計算有多少種方法到達頂層 輸入 樓層的層數 輸出 一共有多少種走法 思路 直接dp就好了,設dp方程為dp i 2 dp i 0 表示走一步之後達到第i層,那麼轉移方程就是dp ...