公交车人数问题(某公司在线笔试编程题)
2015-09-14 12:49
375 查看
1.题目描述(回忆版):
假设公交车有n(n介于[1,100])站,
在第i站,下车人数为a[i]人,上车的人数为b[i]人,
问公交车人数最多的时候为多少人。
示例
输入
4
0 3
1 3
1 2
2 1
输出
6
程序分析
1.其实这个场景大家都很熟悉,因为大家都做过公交车,车没到一站,上上下下的人,是一个动态的过程,在开动的过程里,在两个站之间,总会出现一个峰值即人数最多的时候。
2.在基于1的认识下,再进行分析
4个站台
下 上 单个站台人数
0 3 3
1 3 2
1 2 1
2 1 -1
关于单个站台人数,其实就是在这个站台上,上车人数减去单个人数的数量
3.在基于2的思考下,第三个表很容易列出了
4个站台
下 上 单个站台人数 到目前站台余下人数
0 3 3 3
1 3 2 5
1 2 1 6
2 1 -1 5
4.关于到目前站台余下人数,其实就是这个到下个站台之前,车在开动时,上个站台单个站台人数加这个站台的,如第0个站台,加第1个站台就是3加2 等于5,做到第三步,基本已经解答差不多了,欠缺一个搜索最大值的过程,在到目前站台余下人数里,搜索到6为最大值,结果出来。
下面给出我解答的代码(粗略)
这个程序在OJ平台下是通过不了的,很久没做ACM了,输入性检查怎么弄,忘得一干二净了,因此这个只是做了主过程,比如输入了一组不合法的数据,需要做处理,写的程序遇到这种情况就死了。大家对于公交车的共识,如在第一个站台,因为公交发的是空车,第一个站台下车人数一定是0人,以后每个站台下车的人数不会多于车上现有的人数,最后所有的人数都一定是非负的,所以,写到这里,给出的程序只是完成了60%的工作,平台通过不了,其实这道题的难度倒是不大,但诚实地说自己输入性检查那块忘得一干二净了,考察基本的东西很多,但真正想要一下AC,跟平时多训练是离不开的。最后PS:这是一道在线笔试的最后一道编程题,占20分,评价:难度不高,但一下通过还是有难度的。
后话
最近参加了一个某公司的在线笔试,这是最后一道编程题,事后想想其实并没有一开始想象的那么难,甚至比我遇到的很多问题,要简单的多。但第一次参加这样的在线考试,当然原本就是抱着试一试的心态,没有仔细地进行系统性的复习。考试的过程里,前面是关于公司价值观的一些选择题,难度还好,大多数选择题比较重基础,因为是校园考试吗,但广度是有的,比如涉及到到了操作系统,数据库,计算机网络,编程语言等等,深度也是有的,比如考到了计算机网络的载波检测,一些计算公式的简单应用等等,很细小的概念,平时不认真看书,靠突击基本是不可能覆盖到所有知识点的。深度方面,有一定深度但并不刻意,最后给自己的总结,心服口服,最后做到编程题的时候,还剩下不多的时间,以为就要做出正确答案的时候,考试时间到了。
通过这次考试,透露给我的信息是,在学校里学习的知识,看似凌乱,但笔试考到的东西就正是那些我们以前考试前背过,考后被扔掉的东西。最后的编程题看出,给出的场景大家都有共识(都坐过公交车),难度并不是很大,多还是考察编程思路和编程习惯,就我感觉的话。
在这里不误人子弟,还是要多读书,不管你丑不丑。谨以共勉
假设公交车有n(n介于[1,100])站,
在第i站,下车人数为a[i]人,上车的人数为b[i]人,
问公交车人数最多的时候为多少人。
示例
输入
4
0 3
1 3
1 2
2 1
输出
6
程序分析
1.其实这个场景大家都很熟悉,因为大家都做过公交车,车没到一站,上上下下的人,是一个动态的过程,在开动的过程里,在两个站之间,总会出现一个峰值即人数最多的时候。
2.在基于1的认识下,再进行分析
4个站台
下 上 单个站台人数
0 3 3
1 3 2
1 2 1
2 1 -1
关于单个站台人数,其实就是在这个站台上,上车人数减去单个人数的数量
3.在基于2的思考下,第三个表很容易列出了
4个站台
下 上 单个站台人数 到目前站台余下人数
0 3 3 3
1 3 2 5
1 2 1 6
2 1 -1 5
4.关于到目前站台余下人数,其实就是这个到下个站台之前,车在开动时,上个站台单个站台人数加这个站台的,如第0个站台,加第1个站台就是3加2 等于5,做到第三步,基本已经解答差不多了,欠缺一个搜索最大值的过程,在到目前站台余下人数里,搜索到6为最大值,结果出来。
下面给出我解答的代码(粗略)
#include <iostream> #include <vector> using namespace std; int main() { int n = 0; int x = 0; int y = 0; vector<int> vec; while(cin >> n) //输入站台数 { if(n <= 0) break; else { int *a = new int ;//下车人数 int *b = new int ;//上车人数 for(int i = 0; i != n; ++i) { while(cin >> a[i] >> b[i]) //输入上车下车人数 { vec.push_back(b[i]-a[i]); //保存每次单个站台的人数(上车减去下车) } } delete[] a; delete[] b; for(int i = 1; i != vec.size(); ++i) //目前站台余下的人数 vec[i] += vec[i-1]; int max = 0; for(int i = 0; i != n; ++i) //搜索最大值 { vec[0] = max; if(max <= vec[i]) max = vec[i]; } cout << max << endl; } } return 0; }
这个程序在OJ平台下是通过不了的,很久没做ACM了,输入性检查怎么弄,忘得一干二净了,因此这个只是做了主过程,比如输入了一组不合法的数据,需要做处理,写的程序遇到这种情况就死了。大家对于公交车的共识,如在第一个站台,因为公交发的是空车,第一个站台下车人数一定是0人,以后每个站台下车的人数不会多于车上现有的人数,最后所有的人数都一定是非负的,所以,写到这里,给出的程序只是完成了60%的工作,平台通过不了,其实这道题的难度倒是不大,但诚实地说自己输入性检查那块忘得一干二净了,考察基本的东西很多,但真正想要一下AC,跟平时多训练是离不开的。最后PS:这是一道在线笔试的最后一道编程题,占20分,评价:难度不高,但一下通过还是有难度的。
后话
最近参加了一个某公司的在线笔试,这是最后一道编程题,事后想想其实并没有一开始想象的那么难,甚至比我遇到的很多问题,要简单的多。但第一次参加这样的在线考试,当然原本就是抱着试一试的心态,没有仔细地进行系统性的复习。考试的过程里,前面是关于公司价值观的一些选择题,难度还好,大多数选择题比较重基础,因为是校园考试吗,但广度是有的,比如涉及到到了操作系统,数据库,计算机网络,编程语言等等,深度也是有的,比如考到了计算机网络的载波检测,一些计算公式的简单应用等等,很细小的概念,平时不认真看书,靠突击基本是不可能覆盖到所有知识点的。深度方面,有一定深度但并不刻意,最后给自己的总结,心服口服,最后做到编程题的时候,还剩下不多的时间,以为就要做出正确答案的时候,考试时间到了。
通过这次考试,透露给我的信息是,在学校里学习的知识,看似凌乱,但笔试考到的东西就正是那些我们以前考试前背过,考后被扔掉的东西。最后的编程题看出,给出的场景大家都有共识(都坐过公交车),难度并不是很大,多还是考察编程思路和编程习惯,就我感觉的话。
在这里不误人子弟,还是要多读书,不管你丑不丑。谨以共勉
相关文章推荐
- 排序算法之简单插入算法
- Java应用中使用ShutdownHook友好地清理现场
- qt5.2+ opencv2.4.10 + cmake 编译配置过程
- 基于Qt Phonon模块实现音乐播放器
- C++ 拼接字符串的两种方法
- 四:springmvc RESTRUL CRUD
- Eclipse中安装Spring IDE插件
- 二:springmvc Controller
- spirngmvc.一:SpringMVC 配置
- 零基础学python-16.4 global作用域
- 零基础学python-16.4 global作用域
- java 仿qq登陆界面
- delphi完美经典-第16章 Delphi数据库程序设计----使用BDE组件
- 数值型的特殊用法(可实现 var a=(5).plus(3).minus(6); //2) 函数式编程
- Java 1.7 Map类继承
- JavaWeb学习总结--JavaWeb开发入门
- 重拾java系列一java基础(4)
- GOF23设计模式之 单例模式
- PHP判断来访是搜索引擎蜘蛛还是普通用户的代码小结
- C#中Winform程序中如何实现多维表头【不通过第三方报表程序】