杭电2019年计算机复试笔试真题

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

第一题

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。
#include 
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),如图 杭电2019年计算机复试笔试真题_第1张图片

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次就可得到答案,在我们接受的范围之内,所以在考场上就用暴力解了这道题
#include 
#include 
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 + 1 ∑ x = − 1 + 1 S ( s − x , t − y ) × I ( i − x , j − y ) ∣ I'(i,j)=\left|\sum_{y=-1}^{+1}\sum_{x=-1}^{+1} S(s-x,t-y)×I(i-x,j-y)\right| I(i,j)=y=1+1x=1+1S(sx,ty)×I(ix,jy)

特别的,当卷积进行到图像上边缘时复制原图像的第0行,当卷积进行到图像左边缘时复制原图像的第0列,当卷积进行到图像下边缘时复制原图像的第n-1行,当卷积进行到图像右边缘时复制原图像的第n-1列。 杭电2019年计算机复试笔试真题_第2张图片

Problem 1

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

Problem 2

根据上述描述画出下图pI(n,m) 杭电2019年计算机复试笔试真题_第3张图片在模板St下经过卷积处理的图形

S t = [ − 1 − 2 − 1 0 0 0 1 2 1 ] St=\left[ \begin{matrix} -1 & -2 & -1\\ 0 & 0 & 0\\ 1 & 2 & 1 \end{matrix} \right] St=101202101

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
#include 
#include 
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;
}

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

你可能感兴趣的:(复习备考)