2018年愛奇藝校招筆試
我選的是前端方向,所以編程題的題目也比較簡單,但是坑很多呀,不知道錯在哪,最後沒辦法直接用最暴力的方法AC了。
筆試分為選擇和編程,選擇20個,每個三分,編程題兩道每道20分。
選擇題考點:
1、數據結構(包括大頂堆、希爾排序、B-樹、以及hash)
2、計算機網絡(只考了一兩題,TCP和UDP)
3、HTML/CSS(CSS3、翻書效果怎麽實現、一張圖上映射多個區域)
4、JS(禁止前進和後退、作用域)
我有印象的應該就是作用域的這個題了:
下面這個代碼輸出什麽(如果我沒記錯,應該就是原題目)
<!DOCTYPE html> <html> <script> function func() { document.write(a); document.write(fun); var a = 1; function fun(){ return 2; } } </script> <body> <a onclick="func()">點擊我</a> </body> </html>
編程題:其實都挺簡單的,但是第一題我沒想對坑點,我想到的點似乎都沒這樣的數據。
第一題:
幸運ID
時間限制:C/C++語言 1000MS;其他語言 3000MS
內存限制:C/C++語言 131072KB;其他語言 655360KB
題目描述:
小C有一張票,這張票的ID是長度為6的字符串,每個字符都是數字,他想讓這個ID變成他的辛運ID,所以他就開始更改ID,每一次操作,他可以選擇任意一個數字並且替換它。
如果這個ID的前三位數字之和等於後三位數字之和,那麽這個ID就是辛運的。你幫小C求一下,最少需要操作幾次,能使ID變成辛運ID
輸入
輸入只有一行,是一個長度為6的字符串。
輸出
樣例輸入
000000
樣例輸出
0
Hint
輸入樣例2
000018
輸出樣例2
1
樣例解釋:將前三位任意一個改為9即可滿足條件,操作數為1
AC代碼:(直接暴力貪心解決)
// Asimple #include <iostream> #include <algorithm> #include <cstdio> #include <cstdlib> #include <string> #include <cstring> #include <cmath> using namespace std; typedef long long ll;const int maxn = 100000+5; ll n, m, T, len, cnt, num, ans, Max, k; string str; int max_a[3], min_a[3]; void input(){ while( cin >> str ) { int sum1 = 0, sum2 = 0; for(int i=0; i<6; i++) { if( i < 3 ) sum1 += (str[i]-‘0‘); else sum2 += (str[i]-‘0‘); } int cnt = abs(sum1-sum2); if( sum1>sum2 ) { for(int i=0; i<6; i++) { if( i<3 ) max_a[i] = max((str[i]-‘0‘), 9-(str[i]-‘0‘)); else min_a[i-3] = max((str[i]-‘0‘), 9-(str[i]-‘0‘)); } } else { for(int i=0; i<6; i++) { if( i>=3 ) max_a[i-3] = max((str[i]-‘0‘), 9-(str[i]-‘0‘)); else min_a[i] = max((str[i]-‘0‘), 9-(str[i]-‘0‘)); } } sort(max_a, max_a+3); sort(min_a, min_a+3); int res = 0, j = 2, i = 2; while( cnt > 0 ) { int te = max(max_a[i], min_a[j]); cnt -= te; if( te == max_a[i] ) i--; else j --; res ++; } cout << res << endl; } } int main() { input(); return 0; }
91%代碼(第一版就是91%,之後改的只降不升,最後十分鐘無能為力只能暴力AC,求大神找出坑點)
// Asimple #include <iostream> #include <algorithm> #include <cstdio> #include <cstdlib> #include <queue> #include <vector> #include <string> #include <cstring> #include <stack> #include <set> #include <map> #include <cmath> using namespace std; typedef long long ll;const int maxn = 100000+5; ll n, m, T, len, cnt, num, ans, Max, k; //vector<int> a[maxn]; string str; int a[10]; void input(){ while( cin >> str ) { memset(a, sizeof(a), 0); int sum1 = 0, sum2 = 0; for(int i=0; i<6; i++) { if( i < 3 ) sum1 += (str[i]-‘0‘); else sum2 += (str[i]-‘0‘); } int cnt = abs(sum1-sum2); int res = cnt/9 + (cnt%9!=0); // 下面這個判斷是我想的坑點 // 但是沒有下面的語句一樣也是91% if( cnt == 9 ) { if( a[0]+a[9] == 0 ) res++; } else if( cnt == 18 ) { if( a[0]+a[9]<2 ) res ++; } cout << res << endl; } // pas; } int main() { input(); return 0; }
第二題:
局長的食物
時間限制:C/C++語言 1000MS;其他語言 3000MS
內存限制:C/C++語言 131072KB;其他語言 655360KB
題目描述:
局長有N種食物,每種食物有Ai份。
每天局長會吃一份食物,或者買一份食物(即每天只能進行吃或買其中的一種動作),這樣過了M天
現在局長想知道M天後第p種食物的份數排名(從大到小,相同算並列,例如3 3 2,則排名為1 1 3)
N,M,P<=100,Ai<=1000
輸入
第一行N M P
第二行N個數Ai
接下來M行,每行A i或者B i分別表示買一份食物i,吃一份食物i
輸出
一個答案
樣例輸入
3 4 2
5 3 1
B 1
A 2
A 2
A 3
樣例輸出
1
簡單排序,註意名次的增加就好
AC代碼:
// Asimple #include <iostream> #include <algorithm> #include <cstdio> #include <cstdlib> #include <queue> #include <vector> #include <string> #include <cstring> #include <stack> #include <set> #include <map> #include <cmath> #define INF 0x3f3f3f3f #define debug(a) cout<<#a<<" = "<<a<<endl #define test() cout<<"============"<<endl #define CLS(a,v) memset(a, v, sizeof(a)) #define pas system("pause") using namespace std; typedef long long ll; typedef unsigned long long ull; int dx[] = {-1,1,0,0,-1,-1,1,1}, dy[]={0,0,-1,1,-1,1,1,-1}; const int maxn = 1000+5; const ll mod = 1000000007; ll n, m, T, len, cnt, num, ans, Max, k; //vector<int> a[maxn]; struct node{ int ind; int sum; bool operator < (const node& a) const { return sum>a.sum; } }; node a[maxn]; void input(){ int p; while( cin >> n >> m >> p ) { for(int i=1; i<=n; i++) { cin >> a[i].sum; a[i].ind = i; } char ch; while( m -- ) { cin >> ch >> num; if( ch == ‘A‘ ) { a[num].sum ++; } else { if( a[num].sum>0) a[num].sum --; } } sort(a+1, a+n+1); int cnt = 0, te = 1; a[0].sum = -1; for(int i=1; i<=n; i++) { if( a[i].sum !=a[i-1].sum ) { cnt += te; te = 1; } else { te ++; } if( a[i].ind == p ) { cout << cnt << endl; break; } } } // pas; } int main() { input(); return 0; }
2018年愛奇藝校招筆試