杭电2019年计算机复试真题

此复试题目是根据博主在考场上的记忆回忆复原的题目。为了恢复试题的原貌,我根据试题要求进行合理的脑补,按照oj系统的风格补全了试题的Problem Description、Input、Output、Sample Input、Sample Out等内容,并加入了详解、具体的代码实现。题目在卷子上的具体呈现形式是洛谷oj那个样子的,所以仅供大家参考。有什么错误、不合理的地方欢迎指出。
以下题目中的数据除第三题外,都是我瞎编的。原创不易,还请大家多支持

第一题

Problem Description

有一群人去电影院看电影。但电影院有个很奇怪的规定:成人只能分到数字奇数座位号,未满18岁的儿童只能分到数字为偶数的座位号。

Input

输入共有n个人去看电影(1<=n<1000),接下来输入n个人的座位号,每个座位号用空格隔开

Output

依次输出此次看电影成人的人数以及成人在所有人中所占的比例、未成年人的人数以及未成年人在所有人中所占的比例,计算出的比例保留两位小数,每个输出用空格隔开

Sample Input

8 13 12 10 8 3 24 21 19

Sample Output

4 0.50 4 0.50

这道题就是个送分题,没什么难度,注意下计算比例时的精度问题就ok。

1
2
3
4
5
6
7
8
9
10
11
12
#include <stdio.h>
int main() {
int n, t, cnt1 = 0, cnt2 = 0;
scanf("%d", &n);
while (n--)
{
scanf("%d", &t);
if (t % 2 != 0)cnt1++;//统计成年人数
else cnt2++;//统计未成年数
}
printf("%d %.2f %d %.2f\n", cnt1, cnt1 * 1.0 / (cnt1 + cnt2), cnt2, cnt2 * 1.0 / (cnt1 + cnt2));//输出
}

第二题

Problem Description

有一个大容器,现在向其中加入若干铅锤的木板,每个木板的顶端坐标记为(i,yi),如图

Input

输入共加入n个木板(1<=n<1000),接下来输入n个数字表示加入的n个木板的高度,每个高度用空格隔开

Output

输出该容器最大能装多少体积的水(容器不允许倾斜)

Sample Input

8 1 8 6 4 5 3 7 2

Sample Output

35

当时看到这道题的时候并没有想到什么特别好的办法,但注意到这道题的n的取值范围,1到1000。如果我们用暴力解的话复杂度是O(n^2),也就是说最多计算100w次就可得到答案,在我们接受的范围之内,所以在考场上就用暴力解了这道题

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
#include <stdio.h>
#include <algorithm>
using namespace std;
int arr[1000];
int main() {
int n, MAX = 0;
scanf("%d", &n);
for (int i = 1; i < n; i++)//输入每一个木板的高度
scanf("%d", &arr[i]);
for (int i = 1; i <= n; i++)//遍历每一个木板
for (int j = i+1; j <= n; j++)//遍历该木板后的每一个木板
MAX = max(MAX, (j - i) * min(arr[i], arr[j]));//计算当前两木板所能围成的体积,取最大值
printf("%d\n", MAX);
return 0;
}

第三题

Problem Description

图像的卷积处理是深度学习中非常重要的一种方法,通常是运用一个3×3的模板矩阵s来对长n,宽m的原图像pI(n,m)进行卷积,得到卷积后图像I'(i,j)的公式为

I(i,j)=y=1+1x=1+1S(sx,ty)×I(ix,jy)I'(i,j)=\left|\sum_{y=-1}^{+1}\sum_{x=-1}^{+1} S(s-x,t-y)×I(i-x,j-y)\right|

特别的,当卷积进行到图像上边缘时复制原图像的第0行,当卷积进行到图像左边缘时复制原图像的第0列,当卷积进行到图像下边缘时复制原图像的第n-1行,当卷积进行到图像右边缘时复制原图像的第n-1列。

Problem 1

写出实现上述卷积功能的函数Convolution(unsigned char* pI,unsigned char* S,int width,int height)

Problem 2

根据上述描述画出下图pI(n,m)在模板St下经过卷积处理的图形

St=[121000121]St=\left[ \begin{matrix} -1 & -2 & -1\\ 0 & 0 & 0\\ 1 & 2 & 1 \end{matrix} \right]

Problem 3

给出读取图片方法unsigned char* readBmp(char fileName[100],unsigned char *pI,int width,int height),保存图片方法void readBmp(char fileName[100],unsigned char *pIBuffer,int width,int height)(以上两个方法不用实现)完成上题的卷积过程

整张卷子里可能就属这道题最难了,但它难并不是难在逻辑上,而是在你的理解上。因为我没有接触过图像处理相关知识,所以考场上也只能一顿乱写,也不知道对错,所以这里就不放不来我的代码了。有大神会的话可以在评论区贴出来呀!

第四题

Problem Description

有一群人,现在告诉你他们之间的朋友关系。若A与B是朋友,B是C的朋友,则A与C也是朋友。朋友关系都是双向的,即A与B是朋友,B与A也是朋友。那么A、B、C就在同一个“朋友圈”

Input

首先输入n,m表示有n个人,m对关系(1<=n<2000),接下来有m行每一行表示一对关系(输入每个数字代表一个人)

Output

输出在当前输入关系的情况下“朋友圈”的数量

Sample Input

8 7
1 2
2 4
4 1
5 7
4 3
6 2
7 8

Sample Output

2
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
#include <stdio.h>
#include <string.h>
int Tree[2000];
int findRoot(int x) {//查找当前x属于哪个朋友圈
if (Tree[x] == -1)return x;
int temp = findRoot(Tree[x]);
Tree[x] = temp;
return temp;
}
int main() {
int n, m, cnt = 0;
memset(Tree, -1, sizeof(Tree));
scanf("%d%d", &n, &m);
while (m--)
{
int a, b;
scanf("%d%d", &a, &b);
if (findRoot(a) != findRoot(b))//若a与b有朋友关系,且还没有在同一个朋友圈
{
Tree[a] = b;//并入该朋友圈
cnt++;//并入朋友圈的人数递增
}
}
printf("%d\n", n - cnt);
return 0;
}

这道题也比较简单,就是一个并查集的简单应用,题目的要求也很明确,就是求有多少个集合

文章作者: Teily
文章链接: https://teily.cn/article/HDU2019.html
版权声明: 本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来自 TeilyMa's Blog