2019杭电计算机复试笔试题

1.电影院的座位分配为成年人的座位为奇数,非成年人的座位为偶数。现在输入一个N代表人数,依次输入N个有人的座位号,判断成年人有几个,所占比例是多少(保留小数点后两位),非成年人有几个,所占比例是多少(保留小数点后两位)。

例:input: 5 5 3 2 6 11   

       output:  3  0.60  2  0.40

参考代码(c语言):

#include
using namespace std;

int main(){
    int    N; //总人数 
    int adult = 0, child = 0; //成年人的人数  非成年人人数
    scanf("%d", &N);
    int temp;
    for(int i = 0; i < N; i++){
        scanf("%d", &temp);
        if(temp % 2 != 0) adult++;
        else child ++;
    }
    printf("%d %0.2lf %d %0.2lf\n", adult, (double)adult/(double)N, child, (double)child/(double)N);
    return 0;

 

2.在二维坐标系中,做N条垂直线(与x轴垂直),起点为(i, 0),终点为(i, Yi)。i为自然数, 0<= i <= N。试从N条垂直线中取出2条并且与X轴形成一个凹型水槽,向其中注水,问如何选择垂线能使注入的水最多(即两条垂线的x坐标之差的绝对值乘上两条垂线段中y坐标较小的那个,得到的结果要最大)。先输入一个数N,代表垂线段的个数,在输入N个Yi(i = 0,1,2.....N-1)。

例:input: 11 2 8 6 7 4 8 9 2 7 3 5   

       output:  49

参考代码(c语言):

#include
#include
using namespace std;

int main(){
    int N;
    scanf("%d", &N);
    int a[N];
    for(int i = 0; i < N; i++)
      scanf("%d", &a[i]);
    int maxn = 0;
    for(int i = 0; i < N-2; i++){
      for(int j = i+1; j < N; j++)
      {
          int temp = (j-i)*min(a[i], a[j]);
          if( temp > maxn) maxn = temp;
      }    
    }
    printf("%d\n", maxn);  
    return 0;
}

 

3.使用卷积神经网络将一张图片进行卷积处理。

(1)给出卷积公式,还给出图片的边缘处理方式,要求用代码实现图片卷积的过程。

(2)给出一张图片,让你画出卷积后的图片。

(3)给出两个函数(已知,直接调用即可,不用实现),一个是图片读入函数,一个是图片保存函数。要求实现从图片读入,经过卷积变形,最后保存结果这么一个过程。//第三题还可以,直接依据已经存在的函数进行调用即可,所以说难题中也有可以拿分项

/*

本题是所有算法题目中最复杂的一题,关键是看不太懂,如果看懂了题目,实现起来应该不难。我这里只能给出题目的大概意思,一来是题目太长,二来是我对题目意思不太理解。

*/

 

4.找朋友。假设A是B的朋友,那么B也是A的朋友,C与B为朋友,则C与A也为朋友,另外,自己与自己也是朋友。输入一个数N,代表人数,紧接着输入一个N*N的矩阵,1代表两个人是朋友,0代表两个人不是朋友。求有几个朋友圈。

例:input: 3 

                 1 1 0

                 1 1 0

                  0 0 1

        output: 2

参考代码(c语言):

#include
#include
#include
using namespace std;

int main(){
    int N;
    scanf("%d", &N);
    int a[N][N]; //朋友关系矩阵 
    for(int i = 0; i < N; i++)
      for(int j = 0; j < N; j++)
        scanf("%d", &a[i][j]);
    int vis[N]; //访问数组,1表示该节点已经访问过,0代表未访问过 
    fill(vis, vis + N, 0);  //初始化全为0
    int num = 0; //朋友圈数 
    for(int i = 0; i < N; i++){ //i代表人的编号,这里要依此遍历每一个人 
      if(vis[i] == 0){
        num++;
        queue q;
        q.push(i);
        vis[i] = 1;
        while(!q.empty()){
            int now = q.front();
            q.pop();
            for(int j = 0; j < N; j++){
                if(vis[j] == 0 && a[now][j] == 1){
                    q.push(j);
                    vis[j] = 1;
                }
            }
        } 
        }
    } 
    printf("%d\n", num);
    return 0;
}

/*

本题与算法笔记上的并查集那一节的例题相似,建议用并查集的思想来求解,我这里用的bfs来求解(O(num*N*N)),在考试中我用的是dfs的思想(我觉得dfs的时间复杂度是最高的)。本题的核心是求解连通块的数量,因此使用bfs或者dfs均可,但是在性能上并查集算法更优。建议学弟学妹把这题用bfs,dfs,并查集都实现一遍,这样对图的理解能够达到更深的层次

*/

 

后记:考研结束了,虽然成绩并不靠前,但有幸能进入一个实验室继续深入学习。实验室很正规很严格,感觉我的三年研究生生活过的会和高中类似,或许会更辛苦,毕竟毕业还要一篇SCI论文。大学过的一般,挺轻松的,以至于毕业都找不到理想的工作,有点沮丧。希望研究生三年毕业后能浴火重生!与君共勉。

 

 

你可能感兴趣的:(2019杭电计算机复试笔试题)