网易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; }
我每天都在努力,只是想证明我是认真的活着.