您的位置:首页 > 编程语言

公交车人数问题(某公司在线笔试编程题)

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为最大值,结果出来。

下面给出我解答的代码(粗略)

#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分,评价:难度不高,但一下通过还是有难度的。

后话

最近参加了一个某公司的在线笔试,这是最后一道编程题,事后想想其实并没有一开始想象的那么难,甚至比我遇到的很多问题,要简单的多。但第一次参加这样的在线考试,当然原本就是抱着试一试的心态,没有仔细地进行系统性的复习。考试的过程里,前面是关于公司价值观的一些选择题,难度还好,大多数选择题比较重基础,因为是校园考试吗,但广度是有的,比如涉及到到了操作系统,数据库,计算机网络,编程语言等等,深度也是有的,比如考到了计算机网络的载波检测,一些计算公式的简单应用等等,很细小的概念,平时不认真看书,靠突击基本是不可能覆盖到所有知识点的。深度方面,有一定深度但并不刻意,最后给自己的总结,心服口服,最后做到编程题的时候,还剩下不多的时间,以为就要做出正确答案的时候,考试时间到了。

通过这次考试,透露给我的信息是,在学校里学习的知识,看似凌乱,但笔试考到的东西就正是那些我们以前考试前背过,考后被扔掉的东西。最后的编程题看出,给出的场景大家都有共识(都坐过公交车),难度并不是很大,多还是考察编程思路和编程习惯,就我感觉的话。

在这里不误人子弟,还是要多读书,不管你丑不丑。谨以共勉
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: