1. 程式人生 > >2018年愛奇藝校招筆試

2018年愛奇藝校招筆試

ans cout map turn func 數字 break sys operator

  我選的是前端方向,所以編程題的題目也比較簡單,但是坑很多呀,不知道錯在哪,最後沒辦法直接用最暴力的方法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年愛奇藝校招筆試