網易2018實習生招聘筆試題


可能題目的順序不一樣,但是題目應該是一樣的。

1.一條街有n個位置,每個位置需要照亮的話用 . 表示,不需要照亮的話用 X 表示,每盞路燈能照亮,i - 1, i , i + 1三個位置,問最少用多少路燈,能照亮所有要求的位置。

/*************************************************************************
    > File Name: A.cpp
    > Author: LyuCheng
    > Created Time: 2018-03-27 19:04
    > Description: 問題的實質到最后實際上就是遍歷一遍,遇到一個.不管后邊兩
        個是什么,統統在i + 1的位置按上一個路燈,思考一下是不是?
 ************************************************************************/

#include <bits/stdc++.h>

#define MAXN 1234

using namespace std;

int t;
int n;
char str[MAXN];
int ans;

inline void init() {
    memset(str, '\0', sizeof str);
    ans = 0;
}

int main(int argc, char**argv) {
    freopen ("in.txt", "r", stdin);
    scanf ("%d", &t);
    while (t --) {
        init();
        scanf ("%d", &n);
        scanf ("%s", str);
        for (int i = 0; i < n; i ++) {
            if (str[i] == 'X')
                continue;
            else {
                ans ++;
                for (int j = i; j < n && j < i + 3; j ++)
                    str[j] = 'X';
            }
        }    
        printf("%d\n", ans);
    }    
    return 0;
}

2.有這樣一種序列,1,12,123, ... 123456910111213

問你區間[l, r]中有多少項不能被3整除。

/*************************************************************************
    > File Name: B.cpp
    > Author: LyuCheng
    > Created Time: 2018-03-27 20:09
    > Description: 打表找個規律,第i項:i % 3 == 0這一項就能被3整除
 ************************************************************************/

#include <bits/stdc++.h>

using namespace std;

int l, r;
int a, b;

inline void init() {
    a = 0;
    b = 0;
}

int main(int argc, char**argv) {
    init();
    scanf ("%d %d", &l, &r);    
    l --;
    a += (l / 3) * 2;
    if (l % 3 != 0)
        a += (l % 3 - 1);
    b += (r / 3) * 2;
    if (r % 3 != 0)
        b += (r % 3 - 1);
    printf("%d\n", b - a);
    return 0;
}

3.去野餐有n種物品,一個容量為w的背包,(1 <= w <= 2e9) 每件物品 v[i] (0 <= v[i] <= 1e9),有多少種裝法,是的物品總體積不超過w

/*************************************************************************
    > File Name: C.cpp
    > Author: LyuCheng
    > Created Time: 2018-03-27 20:21
    > Description: 這個題正解應該是每次枚舉到一個大於w的狀態i,就能排除后邊
        很多狀態(如果 (j & i) == i (j > i),那么這個狀態就被排除了),所以
        時間負責度會減少很多,記憶化搜索就可以了。
        但是筆試時間不多了,我耍了個小聰明,只記錄最后一個不能的狀態,用來
        排除狀態,結果就卡過了。
 ************************************************************************/

#include <bits/stdc++.h>

#define MAXN 34
#define LL long long

using namespace std;

int n;
LL w;
LL v[MAXN];
LL sum;
LL ans;

inline void init() {
    sum = 0;
    ans = 0;
}

int main(int argc, char**argv) {
    init();
    scanf ("%d %lld", &n, &w);
    for (int i = 0; i < n; i ++) {
        scanf ("%lld", &v[i]);
        sum += v[i];    
    }    
    if (sum <= w) {
        printf("%lld\n", (LL)(1 << n));
        exit(0);
    }
    LL pos = (1 << n);
    for (LL i = 0; i < (1 << n); i ++) {
        if ((i & pos) == pos) {
            continue;
        }
        LL s = 0;
        for (LL j = 0; j < n; j ++) {
            if ((i & (1 << j)) != 0) {
                s += v[j];
            }
            if (s > w) {
                pos = i;
                break;
            }
        }
        if (s <= w)
            ans ++;
    }
    printf("%lld\n", ans);
    return 0;
}

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM