笔试真题

刺骨的言语ヽ痛彻心扉 2021-09-20 10:46 535阅读 0赞

网易实习生

1074344-20180329115033123-838466640.png

题解:超大容量背包问题。因为背包容量过大,不能用背包解法。而物品个数最多只有三十个,但是所有状态也高达2^30,所以将所有物品折半dfs

代码:

ContractedBlock.gif ExpandedBlockStart.gif

  1. #include<iostream>
  2. #include<vector>
  3. #include<cstdio>
  4. #include<cstring>
  5. #include<algorithm>
  6. #include<queue>
  7. #include<cstring>
  8. #include<map>
  9. using namespace std;
  10. void dfs(vector<int>& v, int r, int id, long long tmp, vector<long long>& num, int& w) {
  11. if (tmp > w) return;
  12. if (id > r) {
  13. num.push_back(tmp);
  14. return;
  15. }
  16. dfs(v, r, id+1, tmp, num, w);
  17. dfs(v, r, id+1, tmp+v[id], num, w);
  18. }
  19. int main() {
  20. int n, w;
  21. while (cin>>n>>w) {
  22. vector<int> v(n);
  23. for (int i = 0; i < n; i++) cin>>v[i];
  24. vector<long long> num1, num2;
  25. dfs(v, n/2, 0, 0, num1, w);
  26. dfs(v, n-1, n/2+1, 0, num2, w);
  27. sort(num1.begin(), num1.end());
  28. sort(num2.begin(), num2.end());
  29. long long ans = 0, j = num2.size()-1;
  30. for (int i = 0; i < num1.size(); i++)
  31. while (j >= 0) {
  32. if (num1[i]+num2[j] <= w) {
  33. ans += j+1;
  34. break;
  35. }
  36. j--;
  37. }
  38. cout<<ans<<endl;
  39. }
  40. }

网易游戏

1074344-20180401212514689-2116069753.png

1074344-20180401212521308-1290539182.png

题解:bfs,但是需要四维,分别记录人的位置和箱子的位置

代码:

ContractedBlock.gif ExpandedBlockStart.gif

  1. #include <cstdio>
  2. #include <cstring>
  3. #include <algorithm>
  4. #include<string>
  5. #include<iostream>
  6. #include<queue>
  7. #include<cstdlib>
  8. using namespace std;
  9. const int dir[4][2] = {
  10. {-1, 0}, {
  11. 1, 0}, {
  12. 0, -1}, {
  13. 0, 1}};
  14. int main() {
  15. int n, m, x, y, aimx, aimy, bx, by;
  16. int v[10][10][10][10];
  17. while (cin>>n>>m) {
  18. vector<vector<char> > mapp(n, vector<char>(m));
  19. memset(v, -1, sizeof(v));
  20. for (int i = 0; i < n; i++)
  21. for (int j = 0; j < m; j++) {
  22. cin>>mapp[i][j];
  23. if (mapp[i][j] == 'X') x = i, y = j;
  24. if (mapp[i][j] == '*') bx = i, by = j;
  25. if (mapp[i][j] == '@') aimx = i, aimy = j;
  26. }
  27. queue<vector<int> > q;
  28. q.push({x, y, bx, by});
  29. v[x][y][bx][by] = 0;
  30. bool flag = 1;
  31. while (!q.empty() && flag) {
  32. vector<int> tmp = q.front();
  33. q.pop();
  34. for (int i = 0; i < 4; i++) {
  35. int xx = tmp[0]+dir[i][0], yy = tmp[1]+dir[i][1];
  36. int xxx = xx+dir[i][0], yyy = yy+dir[i][1];
  37. if (xx >= 0 && xx < n && yy >= 0 && yy < m && mapp[xx][yy] != '#' && (xx != tmp[2] || yy != tmp[3]) && v[xx][yy][tmp[2]][tmp[3]] == -1) {
  38. v[xx][yy][tmp[2]][tmp[3]] = v[tmp[0]][tmp[1]][tmp[2]][tmp[3]]+1;
  39. q.push({xx, yy, tmp[2], tmp[3]});
  40. } else if (xx == tmp[2] && yy == tmp[3] && xxx >= 0 && xxx < n && yyy >= 0 && yyy < m && mapp[xxx][yyy] != '#' && v[xx][yy][xxx][yyy] == -1) {
  41. v[xx][yy][xxx][yyy] = v[tmp[0]][tmp[1]][tmp[2]][tmp[3]]+1;
  42. if (xxx == aimx && yyy == aimy) {
  43. cout<<v[xx][yy][xxx][yyy]<<endl;
  44. flag = 0;
  45. break;
  46. }
  47. q.push({xx, yy, xxx, yyy});
  48. }
  49. }
  50. }
  51. if (flag) cout<<"-1"<<endl;
  52. }
  53. }

360

1074344-20180403204750518-295868992.png

题解:容斥原理,C(k, 0)*k^n-C(k, 1)*(k-1)^n+C(k, 2)*(k-2)^n-……

代码:

ContractedBlock.gif ExpandedBlockStart.gif

  1. #include <cstdio>
  2. #include <cstring>
  3. #include <algorithm>
  4. #include<string>
  5. #include<iostream>
  6. #include<queue>
  7. #include<cstdlib>
  8. using namespace std;
  9. const long long mod = 772235;
  10. long long quick_mod(long long a,long long b,long long m)
  11. {
  12. long long ans=1;
  13. while(b)
  14. {
  15. if(b&1)
  16. {
  17. ans=(ans*a)%m;
  18. b--;
  19. }
  20. b=b>>1;
  21. a=a*a%m;
  22. }
  23. return ans;
  24. }
  25. long long C(int k, int i) {
  26. long long ans = 1;
  27. for (int j = 0; j < i; j++) {
  28. ans = ans*(k-j)/(j+1);
  29. }
  30. return ans;
  31. }
  32. int main() {
  33. long long n, k;
  34. while (cin>>n>>k) {
  35. if (n < k) {
  36. cout<<"0"<<endl;
  37. continue;
  38. }
  39. long long ans = 0;//quick_mod(k, n, mod);
  40. long long flag = 1;
  41. for (int i = 0; i <= k; i++) {
  42. ans = (ans+flag*C(k, i)*quick_mod(k-i, n, mod))%mod;
  43. flag *= -1;
  44. }
  45. if (ans < 0) ans += mod;
  46. cout<<ans<<endl;
  47. }
  48. }

转载于:https://www.cnblogs.com/hqxue/p/8668943.html

发表评论

表情:
评论列表 (有 0 条评论,535人围观)

还没有评论,来说两句吧...

相关阅读

    相关 [笔试]派分糖果

    题目描述 有N个孩子站成一排,每个孩子有一个分值。给这些孩子派发糖果,需要满足如下需求: 1、每个孩子至少分到一个糖果 2、分值更高的孩子比他相邻位的孩子获得更多

    相关 网易笔试之俄罗斯方块

    题目描述 小易有一个古老的游戏机,上面有着经典的游戏俄罗斯方块。因为它比较古老,所以规则和一般的俄罗斯方块不同。 荧幕上一共有 n 列,每次都会有一个 1 x 1 的

    相关 面试笔试(1)

     以下是一些著名互联网企业的部分面试笔试真题以及考察知识点  本文的内容是对一些网址上的知识点介绍做了相应的整理 1.extern的作用 自己理解:应

    相关 杭电15年笔试详解

    目录 题目一: 题目一: 给定一个字符串,计算字符串中数值的个数并求和。其中还包含了负号,若紧跟负号的是一个数值,则表示这是一个负数,若后面跟着的不是数字,则不