题型: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 }
以上是本次笔试全部内容,有问题或者建议欢迎大家随时交流!