網易2018實習生招聘筆試題-C++開發實習生演算法題
阿新 • • 發佈:2018-11-22
[程式設計題] 被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;
}