杭电计算机复试笔试2019题解

1.大家去电影院看电影,总共有n人来看电影,其中年龄不低于18岁的成年人的座位号为奇数,不满18岁的
未成年人的座位号为偶数。现在请统计成年人与未成年的数目,以及他们在总人数里的比例。n<=1000。
样例输入:5 2 3 6 7 11
样例输出:3 0.60 2 0.40

//扫描所有数据,统计奇数个数和偶数个数
//注意:两个int型数据相除还是int型,必须加上强制类型转换,或者直接将其全部变为double型数据进行运算,否则0.6这样的数显示不出来

#include<cstdio>

int main(){
	int n,num;
	int odds=0,even=0;
	scanf("%d",&n);
	for(int i=0;i<n;i++){
		scanf("%d",&num);
		if(num%2==0) even++;
		else odds++;
	} 
	double ration1=(double)even/n;
	double ration2=(double)odds/n;
	printf("%d %.2f %d %.2f",odds,ration2,even,ration1);
	return 0;
} 

/*
给定 n 个非负整数 a1,a2,…,an,每个数代表坐标中的一个点 (i, ai) 。在坐标内画 n 条垂直线,
垂直线 i 的两个端点分别为 (i, ai) 和 (i, 0)。找出其中的两条线,使得它们与 x 轴共同构成的容器可以容
纳最多的水

说明:你不能倾斜容器,且 n 的值至少为 2。
输入: 9 1 8 6 2 5 4 8 3 7(考试的时候给了数量n,n<=1000)
输出: 49
暴力法:直接求出任意两根线之间能容纳的水量,在比较选出最大值,O(n-1+n-2+…+1)=O(n^2)

#include<cstdio>

int main(){
	int n,num[1010];
	scanf("%d",&n);
	int min,temp;//存储两者中的最小值 ,暂时的存水量 
	int total=0;//total中存储最大储水量 
	for(int i=0;i<n;i++){
		scanf("%d",&num[i]);
	}
	for(int i=0;i<n;i++){
		for(int j=i+1;j<n;j++){
			if(num[i]<num[j]) min=num[i];
			else min=num[j];
			temp=(j-i)*min;
			if(temp>total){
				total=temp;
			} 
		}
	}
	printf("%d\n",total);
	return 0;
} 

百度之后发现可以用双指针法使复杂度降为O(n)
双指针反向扫描,如果左边的小于右边的则指针右移,否则右指针左移,i=0,j=n-1;
思考原理:对于两条竖线,一定是以最低的作为容器的高,那么宽当然是越大越好,所以刚开始两指针分别在头和尾,底是最大的,对于第一条竖线和最后一条来说,高固定了,只有底最大时,存水才最大,假设i=0,j=n-1;num[i]<num[j],那么以num[i]为高,求出此时的存水量是最大的,如果j往前移的过程中,j–,有比num[j]更高的,也没用,因为以最低为标准,如果有比num[i]还低的,那么宽一定更小了,容量也就更小,所以这里求出了num[i]这个竖线的最大存储容量,然后i++,移动指针求另一条

#include<cstdio>
#include<algorithm>
using namespace std;
int main(){
	int n,num[1010];
	scanf("%d",&n);
	for(int i=0;i<n;i++){
		scanf("%d",&num[i]);
	}
	int i=0,j=n-1;
	int total=0;
	while(i<j){//两指针相遇是退出循环
		int temp=(j-i)*min(num[i],num[j]); 
		if(temp>total){
			total=temp;
		}
		if(num[i]<num[j]) i++;//走链 
		else j--;
	}	
	printf("%d\n",total);
	return 0;
} 

*/
/*题3:有个班级,里面有N个学生,他们之中有些是朋友有些不是,比如如果A是B的朋友,B是C的朋友,
那么A就是C的间接朋友,我们定义所谓的朋友圈就是由直系和间接朋友所组成的群体。N的范围为 [1,200].

输入:
3
1 1 0
1 1 0
0 0 1
输出: 2
解释:第0个和第1个学生是直系朋友,所以记为1个朋友圈。第2个学生他没什么朋友也
要算一个朋友圈,所以结果为2
输入:
3
1 1 0
1 1 1
0 1 1
输出: 1
解释:第0个和第1个学生是直系朋友,第1和第2个也是,所以第0和第2个学生是
间接朋友,三个学生都在同个朋友圈里,返回1.
*/
//看题的话可以求连通块的数量,即BFS和DFS,或者用并查集判断两块是否属于同一个连通块
//并查集在合并时要求两个是不同的集合,所以一定没有环,并查集产生的每一个集合都是一颗树

#include<cstdio>

const int maxn=210;
int father[maxn];
bool isroot[maxn]={false};//记录某个节点是否是一个完整集合的根节点 
int matrix[maxn][maxn];
int findFather(int x){
	int a=x;
	while(x!=father[x]){
		x=father[x];
	}
	//路径压缩
	while(a!=father[a]){
		int z=a;
		a=father[a];//下面两行不能颠倒 
		father[z]=x;
	} 
}

int main(){
	for(int i=1;i<maxn;i++){//并查集初始化 
		father[i]=i;
	}
	int n;
	scanf("%d",&n);
	for(int i=1;i<=n;i++){
		for(int j=1;j<=n;j++){
			scanf("%d",&matrix[i][j]);
			if(matrix[i][j]==1){//合并操作 
				int fax=findFather(i);
				int fay=findFather(j);
				if(fax!=fay){//不在一个连通块中,将其合并 
					father[fax]=fay; 
				}
			}
		}
	}
	for(int i=1;i<=n;i++){
		printf("%d ",father[i]);
		isroot[findFather(i)]=true;
	} 
	int ans=0;
	for(int i=1;i<=n;i++){
		if(isroot[i]==true){
			ans++;
		}
	}
	printf("%d\n",ans);
	return 0;
} 

//DFS,BFS算法见2015年题2

还有一题是关于图像处理的,
.使用卷积神经网络将一张图片进行卷积处理。
(1)给出卷积公式,还给出图片的边缘处理方式,要求用代码实现图片卷积的过程。
(2)给出一张图片,让你画出卷积后的图片。
(3)给出两个函数(已知,直接调用即可,不用实现),一个是图片读入函数,一个是图片保存函数。要求实现从图片读入,经过卷积变形,最后保存结果这么一个过程。//第三题还可以,直接依据已经存在的函数进行调用即可,所以说难题中也有可以拿分项

  • 1
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值