第一题
电影院要给顾客排座位号,规定成年人为奇数,未成年人为偶数。先输入总人数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);
}
}