网易有道2018秋季校园招聘-c++

题型:20单选+3道编程+2道问答

单选:

问答:

编程:

1、

分析:这道题算是试水题目,非常简单,没有用到任何高级算法,甚至数据结构都没有太多的涉及到,思路很直接,就是5步以上的每次走5步,5步以下的直接走对应步数,然后求和就是总共需要的次数

代码:

 1 #include <iostream>
 2 #include <vector>
 3 using namespace std;
 4 int main()
 5 {
 6     int s;
 7     cin >> s;
 8     if (s <= 5)
 9         cout << 1 << endl;
10     else if (s % 5 == 0)
11         cout << s / 5 << endl;
12     else
13         cout << s / 5 + 1 << endl;
14     return 0;
15 }

2、

分析:这道题乍一看不难,但是自己想想还是挺麻烦,这道题在规定时间内我没做出来,我想的思路就是从头遍历,每次翻转之后就对牌面做标记,最后只需要统计被翻转奇数次的牌的数量,这个思路时间空间复杂度都很高,估计要超时,肯定有更好解决办法

暴力搜索代码:

1 #include <iostream>
2 #include <vector>
3 using namespace std;

3、

分析:这道题还是很有意思的,场景是倒香槟,每一层的杯子都有固定容量,满了之后就会到下一层,每次的操作分为两种:1、倒酒,想某一层倒入一定的酒量;2、询问,询问某一层有多少酒。对于每一个询问操作,都需要输出一个数字来回答。两种操作分别用数字1和2来表示。这道题的难点在于如何去分析整个流程,我的做法是用一个vector记录每层容量,用另一个vector表示每一次已经有的酒量,每一次倒酒时,都依次由上到下遍历,一直到最后一层;每次询问时,直接从vector中读取剩余酒量。写完程序才发现其实是有不少坑的,不过我还是在规定时间内完成了,还是比较开心的!

代码:

 1 #include <iostream>
 2 #include <vector>
 3 using namespace std;
 4 int main()
 5 {
 6     int n, m;
 7     cin >> n >> m;
 8     vector<int> cap = vector<int>(n+1, 0);
 9     vector<int> remain = vector<int>(n+1, 0);
10     //vector<bool> full = vector < bool > (n+1, false);   // is full?
11     for (int i = 1; i <= n; i++)
12         cin >> cap[i];
13     for (int i = 1; i <= m; i++)
14     {
15         int com;
16         cin >> com;
17         if (com == 2) //pour
18         {
19             int x, v;
20             cin >> x >> v;
21             if (v + remain[x] <= cap[x])
22                 remain[x] = v + remain[x];
23             else
24             {
25                 int t = v + remain[x] - cap[x];  //duo yu
26                 for (int i = x; i <= n; i++)  //这里可以做一些优化,循环条件变为 i <= n && t ,意思是当t为0是不再循环,可以减少循环次数
27                 {
28                     if (i == x)
29                     {
30                         remain[i] = cap[i];
31                         continue;
32                     }
33                     if (t + remain[i] <= cap[i])
34                     {
35                         remain[i] = t + remain[i];
36                         break;
37                     }
38                     else
39                     {
40                         remain[i] = cap[i];
41                         t = t - cap[i];
42                         //t = t - (cap[i] - remain[i]);
43                     }
44                 }
45             }
46         }
47         if (com == 1) //ask
48         {
49             int k;
50             cin >> k;
51             cout << remain[k] << endl;
52         }
53     }
54     return 0;
55 }

以上是本次笔试全部内容,有问题或者建议欢迎大家随时交流!

原文地址:https://www.cnblogs.com/dapeng-bupt/p/9613999.html