1. 程式人生 > >網易2018實習生招聘筆試題-C++開發實習生演算法題

網易2018實習生招聘筆試題-C++開發實習生演算法題

[程式設計題] 被3整除

時間限制:1秒

空間限制:32768K

小Q得到一個神奇的數列: 1, 12, 123,...12345678910,1234567891011...。並且小Q對於能否被3整除這個性質很感興趣。小Q現在希望你能幫他計算一下從數列的第l個到第r個(包含端點)有多少個數可以被3整除。

輸入描述:

輸入包括兩個整數l和r(1 <= l <= r <= 1e9), 表示要求解的區間兩端。

輸出描述:

輸出一個整數, 表示區間內能被3整除的數字個數。

輸入例子1:

2 5

輸出例子1:

3

例子說明1:

12, 123, 1234, 12345...
其中12, 123, 12345能被3整除。
#include<iostream>
#include<stdio.h>
using namespace std;

int main(){
    long long l, r;
    cin >> l >> r;
    long long sum = 0;
    for (long long i=1; i<=l; i++){
        sum += i;
    }
    long long res = (sum%3==0)? 1:0;
    for (long long i=l+1; i<=r; i++){
        sum += i;
        res += (sum%3==0)? 1:0;
    }
    cout << res;
    return 0;
}

[程式設計題] 安置路燈

時間限制:1秒

空間限制:32768K

小Q正在給一條長度為n的道路設計路燈安置方案。為了讓問題更簡單,小Q把道路視為n個方格,需要照亮的地方用'.'表示, 不需要照亮的障礙物格子用'X'表示。小Q現在要在道路上設定一些路燈, 對於安置在pos位置的路燈, 這盞路燈可以照亮pos - 1, pos, pos + 1這三個位置。小Q希望能安置儘量少的路燈照亮所有'.'區域, 希望你能幫他計算一下最少需要多少盞路燈。

輸入描述:

輸入的第一行包含一個正整數t(1 <= t <= 1000), 表示測試用例數
接下來每兩行一個測試資料, 第一行一個正整數n(1 <= n <= 1000),表示道路的長度。
第二行一個字串s表示道路的構造,只包含'.'和'X'。

輸出描述:

對於每個測試用例, 輸出一個正整數表示最少需要多少盞路燈。

輸入例子1:

2
3
.X.
11
...XX....XX

輸出例子1:

1
3
#include<iostream>
#include<string>
using namespace std;

int main(){
    int t;
    cin >> t;
    while(t--){
        int n;
        string s;
        cin >> n >> s;
        int p = 0; 
        int res = 0;
        while(p<n){
            if (s[p] == 'X')
                p++;
            else if (s[p] == '.' && p+1 != n){
                res++;
                p += 3;
            }
            else{
                res++;
                break;
            }
        }
        cout << res <<endl;
    }
    return 0;
}

[程式設計題] 牛牛的揹包問題

時間限制:1秒

空間限制:32768K

牛牛準備參加學校組織的春遊, 出發前牛牛準備往揹包裡裝入一些零食, 牛牛的揹包容量為w。牛牛家裡一共有n袋零食, 第i袋零食體積為v[i]。牛牛想知道在總體積不超過揹包容量的情況下,他一共有多少種零食放法(總體積為0也算一種放法)。

輸入描述:

輸入包括兩行
第一行為兩個正整數n和w(1 <= n <= 30, 1 <= w <= 2 * 10^9),表示零食的數量和揹包的容量。
第二行n個正整數v[i](0 <= v[i] <= 10^9),表示每袋零食的體積。

輸出描述:

輸出一個正整數, 表示牛牛一共有多少種零食放法。

 

輸入例子1:

3 10
1 2 4

輸出例子1:

8

例子說明1:

三種零食總體積小於10,於是每種零食有放入和不放入兩種情況,一共有2*2*2 = 8種情況。
#include<iostream>
#include<vector>
using namespace std;

int find(const vector<int> v, int fir, int rem){
    if(fir == v.size()-1){
        if (v[fir] <= rem)
            return 2;
        else
            return 1;
    }
    if (v[fir] <= rem)
        return find(v, fir+1, rem-v[fir]) + find(v, fir+1, rem);
    return find(v, fir+1, rem);
}
int main(){
    int n, w;
    cin >> n >> w;
    vector<int> v(n);
    long long sum = 0;
    for (int i=0; i<n; i++){
        cin >> v[i];
        sum += v[i];
    }
    int res;
    if (sum < w)
        res = (1<<n);
    else
        res = find(v, 0, w);
    cout << res;
    return 0;
}