腾讯2019暑期实习生提前批CV岗笔试题
目錄
- 第一題
- 題意
- 思路
- 代碼
- 第二題
- 題意
- 思路
- 代碼
- 第三題
- 題意
- 思路
- 代碼
- 第四題
- 題意
- 思路
- 代碼
- 第五題
- 題意
- 思路
- 代碼
? ? ? ?筆試共有5道編程題,每道題20分,兩個小時。以下內容的編寫全憑記憶和個人理解,如有什么不對的地方,希望大家見諒。
第一題
題意
? ? ? ?一個直線路上有n個點,你在這條路上的某個位置上,你要到達這n個點中的任意n-1個點,使得經過的路徑最短,輸出最短路徑的路程。
思路
? ? ? ?因為只有一個點不走,最優的路徑應該是不走第1個點或者不走第n個點,處理一下特殊情況就行了。但是不知道為啥只過了30%。
代碼
#include<cstdio> #include<cmath> #include<cstdlib> #include<cstring> #include<iostream> #include<algorithm> #include<queue> #include<stack> #include<map> #include<string>using namespace std;int num[100000+10];int main() {long long n, a;while(scanf("%lld%lld",&n,&a)!=EOF){long long ans = 0;long long left_num = 0;long long right_num = 0;for(int i=1;i<=n;++i){scanf("%lld",&num[i]);if(num[i]<=a)left_num++;}if(left_num == 0)ans = num[n-1] - a;else if(left_num == n)ans = a - num[2];else if(left_num == 1){long long ans1 = min(a-num[1],num[n-1]-a)+ num[n-1]-num[1];long long ans2 = num[n]-a;ans = min(ans1, ans2);}else if(left_num == n-1){long long ans1 = a-num[1];long long ans2 = min(num[n]-a, a-num[2])+ num[n]-num[2];ans = min(ans1, ans2);}else{long long ans1 = min(num[n-1]-a, a-num[1]) + num[n-1]-num[1];long long ans2 = min(num[n]-a, a-num[2]) + num[n]-num[2];ans = min(ans1, ans2);}printf("%lld\n",ans);}return 0; }第二題
題意
? ? ? ?有一個n層的塔,每層的高度是不同的。小Q要從塔底走到塔頂,走一層耗費的時間和該層高度相同。但是小Q有一個特殊技能,就是小Q會跳,每次跳躍可以選擇上升一層或者兩層,且不消耗時間,但是弊端是每跳一次后,必須走至少一層才可以再次跳躍。求小Q爬到塔頂耗費的最短時間。
思路
? ? ? ?一個簡單的dp。
? ? ? ??①狀態dp[i][0]表示在第i層選擇走上去,且到當前第i層為止,花費的最少時間。
? ? ? ??②狀態dp[i][1]表示在第i層選擇跳一層,且到當前第i層為止,花費的最少時間。
? ? ? ??③狀態dp[i][2]表示在第i層選擇跳兩層,且到當前第i層為止,花費的最少時間。
? ? ? ?則狀態轉移方程可以寫為:
? ? ? ??①dp[i][0]=min(dp[i-2][2], dp[i-1][1], dp[i-1][0])+num[i];
? ? ? ??②dp[i][1]=dp[i-1][0];
? ? ? ??③dp[i][2]=dp[i-1][0];
? ?? ?最后的答案就是min(dp[n+1][0], dp[n+1][1], dp[n+1][2]),這道題過了100%樣例。
代碼
#include<cstdio> #include<cmath> #include<cstdlib> #include<cstring> #include<iostream> #include<algorithm> #include<queue> #include<stack> #include<map> #include<string>using namespace std;int num[10000+10]; int dp[10000+10][4];int main() {int n;while(scanf("%d",&n)!=EOF){for(int i=1;i<=n;++i)scanf("%d",&num[i]);dp[0][0]=dp[0][1]=dp[0][2]=0;dp[1][0]=num[1];dp[1][1]=0;dp[1][2]=0;for(int i=2;i<=n+1;++i){dp[i][0]=min(min(dp[i-2][2],dp[i-1][1]), dp[i-1][0])+num[i];dp[i][1]=dp[i][2]=dp[i-1][0];//printf("%d %d %d\n",dp[i][0],dp[i][1],dp[i][2]);}printf("%d\n",min(min(dp[n+1][0],dp[n+1][1]),dp[n+1][2]));}return 0; }第三題
題意
? ? ? ?有n張紙牌,數字分別是1到n,紙牌按照牌面從小到大排列。現在小Q要把第一張牌抽出,然后把第二張牌放到末尾,再把第三張牌抽出,把第四張牌放到末尾,…,直至沒有紙牌。輸出抽出的紙牌的順序。
思路
? ? ? ?用隊列模擬,以下代碼過了80%,想一想自己也真是挺蠢的,每一次都從隊列中pop兩個,但是如果隊列中剩最后一張紙牌時,就會seg error,改一下應該就是100%了。
代碼
#include<cstdio> #include<cmath> #include<cstdlib> #include<cstring> #include<iostream> #include<algorithm> #include<queue> #include<stack> #include<map> #include<string>using namespace std;int main() {int n;while(scanf("%d",&n)!=EOF){queue<int> q;for(int i=1;i<=n;++i)q.push(i);while(!q.empty()){int tmp = q.front();q.pop();int tmp2 = q.front();q.pop();q.push(tmp2);printf("%d ",tmp);}printf("\n");}return 0; }第四題
題意
? ? ? ?有一個n×mn\times mn×m大小的黑白相間的棋盤,棋盤的左下角是白色塊?,F在對這個棋盤進行兩個操作,①將左下角坐標為(x0,y0)(x_0,y_0)(x0?,y0?),右上角坐標為(x1,y1)(x_1,y_1)(x1?,y1?)的矩形區域內的全部方塊變為白色;②將左下角坐標為(x2,y2)(x_2,y_2)(x2?,y2?),右上角坐標為(x3,y3)(x_3,y_3)(x3?,y3?)的矩形區域內的全部方塊變為黑色。輸出經過這兩次操作以后棋盤上的黑白塊個數。
思路
? ? ? ?模擬兩次操作,再對兩個矩形的重疊部分特殊處理一下就可以了。以下為通過樣例100%的代碼。
代碼
#include<cstdio> #include<cmath> #include<cstdlib> #include<cstring> #include<iostream> #include<algorithm> #include<queue> #include<stack> #include<map> #include<string>using namespace std;int main() {int t;scanf("%d",&t);while(t--){long long n,m;scanf("%lld%lld",&n,&m);long long x0,y0,x1,y1;long long x2,y2,x3,y3;scanf("%lld%lld%lld%lld",&x0,&y0,&x1,&y1);scanf("%lld%lld%lld%lld",&x2,&y2,&x3,&y3);long long sum_num = n*m;long long white_num = 0;long long black_num = 0;if(sum_num%2 == 1){black_num = sum_num/2;white_num = black_num + 1;}else{black_num = sum_num/2;white_num = black_num;}//printf("----%lld %lld\n",white_num, black_num);long long deta_x1 = x1 - x0 + 1;long long deta_y1 = y1 - y0 + 1;if((deta_x1*deta_y1)%2 == 1){if((x0+y0)%2 ==0) //white{white_num = white_num + ((deta_x1*deta_y1)/2) ;black_num = sum_num - white_num ;}else // black{white_num = white_num + ((deta_x1*deta_y1)/2) + 1;black_num = sum_num - white_num ;}}else{white_num = white_num + ((deta_x1*deta_y1)/2);black_num = sum_num - white_num ;}long long deta_x2 = x3 - x2 + 1;long long deta_y2 = y3 - y2 + 1;if((deta_x2*deta_y2)%2 == 1){if((x2+y2)%2 ==0) //white{black_num = black_num + ((deta_x2*deta_y2)/2) + 1;white_num = sum_num - black_num ;}else // black{black_num = black_num + ((deta_x2*deta_y2)/2);white_num = sum_num - black_num ;}}else{black_num = black_num + ((deta_x2*deta_y2)/2) ;white_num = sum_num - black_num ;}//printf("----%lld %lld\n",white_num, black_num);long long x4 = max(x0,x2);long long y4 = max(y0,y2);long long x5 = min(x1,x3);long long y5 = min(y1,y3);//printf("--------- %lld %lld %lld %lld \n", x4,y4,x5,y5);if(x5>=x4 && y5>=y4){long long deta_x3 = x5 - x4 + 1;long long deta_y3 = y5 - y4 + 1;long long tmp = deta_x3 * deta_y3;if( tmp % 2 == 1){if((x4+y4)%2 ==0) //white{black_num = black_num + ((deta_x3*deta_y3)/2);white_num = sum_num - black_num ;}else // black{black_num = black_num + ((deta_x3*deta_y3)/2) +1 ;white_num = sum_num - black_num ;}}else{black_num = black_num + ((deta_x3*deta_y3)/2);white_num = sum_num - black_num ;}}printf("%lld %lld\n",white_num, black_num);}return 0; }第五題
題意
? ? ? ?一個大小為n的數組,對于數組中的第i(2≤i≤n)i(2\leq i\leq n)i(2≤i≤n)個數字AiA_iAi?,輸出ansi=minj∣Aj?Ai∣ans_i=min_j|A_j-A_i|ansi?=minj?∣Aj??Ai?∣,并輸出對應的位置jjj,如果有多個相同的ansians_iansi?,輸出最小的jjj。
思路
? ? ? ?寫到這道題只剩8分鐘了,雖然知道暴力對于10510^5105的數據肯定過不了,但還是草草的寫了個暴力,過了50%。
代碼
#include<cstdio> #include<cmath> #include<cstdlib> #include<cstring> #include<iostream> #include<algorithm> #include<queue> #include<stack> #include<map> #include<string>using namespace std;int num[100000+10];int main() {int n;while(scanf("%d",&n)!=EOF){for(int i=1;i<=n;++i){scanf("%d",&num[i]);}for(int i=2;i<=n;++i){int ans = 999999999;int ttt = i-1;for(int j=i-1;j>=1;--j){int tmp = fabs(num[j]-num[i]);if(tmp <= ans){ttt = j;ans = tmp;}}printf("%d %d\n",ans,ttt);}}return 0; }總結
以上是生活随笔為你收集整理的腾讯2019暑期实习生提前批CV岗笔试题的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 模型学习 - VAE(变分自编码)专题
- 下一篇: 字节跳动2019暑期实习生算法岗笔试题