2019年杭电笔试题(回忆版)

本文提供四道编程练习题的解答方案,包括座位分配算法、计算最大面积、深度学习算法题和朋友圈关系分析。通过实际案例讲解算法实现思路,适合编程初学者实践。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

第一题
电影院要给顾客排座位号,规定成年人为奇数,未成年人为偶数。先输入总人数n(1<=n<=1000),再输入n个整数,要求输出成年人与未成年人的人数及各自的比例(保留两位小数)。
例:
输入 5  1  2   3  4   5
输出 3  0.60   2   0.40

#include<stdio.h>
int main(){
    int n;//总人数
    int num1,num2;//分别记录成年人与未成年人的人数
    while(scanf("%d",&n)!=EOF){
        int k;
        num1=num2=0;
        for(int i=0;i<n;i++){//输入n个数
            scanf("%d",&k);
            if(k%2!=0)
                num1++;//成年人
            else if(k%2==0)
                num2++;//未成年人
        }
        double a = (double)num1/n;//计算比例
        double b = (double)num2/n;
        printf("%d %.2lf %d %.2lf\n",num1,a,num2,b);//输出
    }
}


第二题
先输入一个整数n(1<=n<=1000),再输入y1 y2 …yn等n个整数,其中yi表示横轴为i纵轴为yi,以(i,0)和(i,yi)为端点做x轴的n个垂线,求任意两个垂线间所能构成的最大面积。
例:
输入 5  1  7  4  3  9
输出 21

#include<stdio.h>
int min(int a,int b)
    {return a<b?a:b;}//返回两个数较小的那个
int main(){
    int n;
    int num[1001];
    while(scanf("%d",&n)!=EOF){
        for(int i=1;i<=n;i++)
            scanf("%d",&num[i]);
        int max=0;//保存最大面积
        for(int i=1;i<n;i++)//遍历每一种可能
            for(int j=i+1;j<=n;j++){
                int area = (j-i)*min(num[i],num[j]);//求面积
                if(area>max)//不断更新最大值
                    max=area;
            }
        printf("%d\n",max);//输出
    }
}

第三题
这是一道深度学习算法题,是试卷4道题中最难的一个,此题有三小问,由于题干太长信息太多实在记不清了。
第四题
有n(1<=n<=100)个小朋友,小朋友之间具有朋友关系并且朋友关系是可以传递的,例如A与B是朋友B与C是朋友那么A与C也是朋友,朋友间构成一个朋友圈,一个朋友圈内所有的小朋友之间都具有朋友关系,求一共有多少朋友圈。先输入一个整数n表示小朋友的人数,再输入一个n行n列的矩阵表示朋友关系。
输入3
0  1   0
1  0   0
0  0   0
输出
2

#include<stdio.h>
struct E{//存朋友关系
    int a;
    int b;//表示a与b是朋友
}edge[6000];
int map[100][100];//邻接矩阵
int Tree[100];
int findRoot(int x){//找x结点的根节点
    if(Tree[x]==-1) return x;
    else{
        int tmp = findRoot(Tree[x]);
        Tree[x] = tmp;
        return tmp;
    }
}
int main(){
    int n;
    while(scanf("%d",&n)!=EOF){
        for(int i=0;i<n;i++)//输入朋友关系
            for(int j=0;j<n;j++)
                scanf("%d",&map[i][j]);
        for(int i=0;i<n;i++)
            Tree[i]=-1;//最初每一个小朋友都是孤立的
        int size=0;//存朋友关系的个数
        for(int i=0;i<n;i++)
            for(int j=i+1;j<n;j++)
                if(map[i][j]==1){//将邻接矩阵转化成边
                   edge[size].a=i;
                   edge[size].b=j;
                   size++;
                }
        for(int i=0;i<size;i++){
            int a=findRoot(edge[i].a);
            int b=findRoot(edge[i].b);
            if(a!=b)//将两个集合合并
                Tree[a] = b;
        }
        int sum=0;//存朋友圈个数
        for(int i=0;i<n;i++)
            if(Tree[i]==-1)
                sum++;
        printf("%d\n",sum);
    }
}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值