程序设计与算法(一)第5周测验(2020春季)
001:与指定数字相同的数的个数
- 总时间限制: 1000ms 内存限制: 65536kB
描述
- 输出一个整数序列中与指定数字相同的数的个数。
输入
- 输入包含三行:
- 第一行为N,表示整数序列的长度(N <= 100);
- 第二行为N个整数,整数之间以一个空格分开;
- 第三行包含一个整数,为指定的整数m。
输出
- 输出为N个数中与m相同的数的个数。
样例输入
3
2 3 2
2
样例输出
2
AC
#include <iostream>
using namespace std;
int main(){
int n,m,str[100],count=0;
scanf("%d",&n);
for(int i=1;i<=n;i++){
scanf("%d",&str[i]);
}
scanf("%d",&m);
for(int i=1;i<=n;i++){
if(str[i]==m){
count++;
}
}
printf("%d",count);
return 0;
}
002:陶陶摘苹果
- 总时间限制: 1000ms 内存限制: 65536kB
描述
-
陶陶家的院子里有一棵苹果树,每到秋天树上就会结出10个苹果。苹果成熟的时候,陶陶就会跑去摘苹果。陶陶有个30厘米高的板凳,当她不能直接用手摘到苹果的时候,就会踩到板凳上再试试。
-
现在已知10个苹果到地面的高度,以及陶陶把手伸直的时候能够达到的最大高度,请帮陶陶算一下她能够摘到的苹果的数目。假设她碰到苹果,苹果就会掉下来。
输入
- 包括两行数据。
- 第一行包含10个100到200之间(包括100和200)的整数(以厘米为单位)分别表示10个苹果到地面的高度,两个相邻的整数之间用一个空格隔开。
- 第二行只包括一个100到120之间(包含100和120)的整数(以厘米为单位),表示陶陶把手伸直的时候能够达到的最大高度。
输出
- 包括一行,这一行只包含一个整数,表示陶陶能够摘到的苹果的数目。
样例输入
100 200 150 140 129 134 167 198 200 111
110
样例输出
5
思考
- 与上一题类似。
AC
#include <iostream>
using namespace std;
int main(){
int num[200],height,count=0;
for(int i=1;i<=10;i++){
scanf("%d",&num[i]);
}
scanf("%d",&height);
for(int i=1;i<=10;i++){
if(num[i]<=height+30){
count++;
}
}
printf("%d",count);
return 0;
}
003:年龄与疾病
- 总时间限制: 1000ms 内存限制: 65536kB
描述
- 某医院想统计一下某项疾病的获得与否与年龄是否有关,需要对以前的诊断记录进行整理,按照0-18、19-35、36-60、61以上(含61)四个年龄段统计的患病人数占总患病人数的比例。
输入
- 共2行,
- 第一行为过往病人的数目n(0 < n <= 100),
- 第二行为每个病人患病时的年龄。
输出
- 按照0-18、19-35、36-60、61以上(含61)四个年龄段输出该段患病人数占总患病人数的比例,以百分比的形式输出,精确到小数点后两位。每个年龄段占一行,共四行。
样例输入
10
1 11 21 31 41 51 61 71 81 91
样例输出
20.00%
20.00%
20.00%
40.00%
思考
- 以百分比的形式输出,精确到小数点后两位,double类型输出。
AC
#include <iostream>
using namespace std;
int main(){
int n,num[101];
double a=0,b=0,c=0,d=0;
scanf("%d",&n);
for(int i=0;i<n;i++){
scanf("%d",&num[i]);
if(num[i]>0 && num[i]<=18){
a++;
}else if(num[i]>=19 && num[i]<=35){
b++;
}else if(num[i]>=36 && num[i]<=60){
c++;
}else{
d++;
}
}
printf("%.2lf%\n",a/n*100);
printf("%.2lf%\n",b/n*100);
printf("%.2lf%\n",c/n*100);
printf("%.2lf%\n",d/n*100);
return 0;
}
004:校门外的树
- 总时间限制: 1000ms 内存限制: 65536kB
描述
-
某校大门外长度为L的马路上有一排树,每两棵相邻的树之间的间隔都是1米。我们可以把马路看成一个数轴,马路的一端在数轴0的位置,另一端在L的位置;数轴上的每个整数点,即0,1,2,……,L,都种有一棵树。
-
由于马路上有一些区域要用来建地铁。这些区域用它们在数轴上的起始点和终止点表示。已知任一区域的起始点和终止点的坐标都是整数,区域之间可能有重合的部分。现在要把这些区域中的树(包括区域端点处的两棵树)移走。你的任务是计算将这些树都移走后,马路上还有多少棵树。
输入
-
第一行有两个整数L(1 <= L <= 10000)和 M(1 <= M <= 100),L代表马路的长度,M代表区域的数目,L和M之间用一个空格隔开。
-
接下来的M行每行包含两个不同的整数,用一个空格隔开,表示一个区域的起始点和终止点的坐标。
-
对于20%的数据,区域之间没有重合的部分;
-
对于其它的数据,区域之间有重合的情况。
输出
- 包括一行,这一行只包含一个整数,表示马路上剩余的树的数目。
样例输入
500 3
150 300
100 200
470 471
样例输出
- 298
思考
- 用数组tree[L+1],赋初值为1 ;
- 输入一个区间都将a中区间内的元素置值0;
- 统计a中非0元素个数即答案。
AC
#include <iostream>
using namespace std;
int l,m,count=0;
int tree[10000+10]; //输入L则有L+1棵树
int main(){
scanf("%d %d",&l,&m);
for(int i=0;i<l+1;i++){
tree[i]=1; //用数组tree[L+1],赋初值为1 ;
}
for(int i=0;i<m;i++){
int a,b;
scanf("%d %d",&a,&b);
for(int j=a;j<=b;j++){
tree[j]=0; //用数组tree[L+1],赋初值为0 ;表示移走
}
}
for(int i=0;i<l+1;i++){
if(tree[i]) count++;
}
printf("%d\n",count);
return 0;
}
005:计算鞍点
- 总时间限制: 1000ms 内存限制: 65536kB
描述
- 给定一个5*5的矩阵,每行只有一个最大值,每列只有一个最小值,寻找这个矩阵的鞍点。
- 鞍点指的是矩阵中的一个元素,它是所在行的最大值,并且是所在列的最小值。
- 例如:在下面的例子中(第4行第1列的元素就是鞍点,值为8 )。
11 3 5 6 9
12 4 7 8 10
10 5 6 9 11
8 6 4 7 2
15 10 11 20 25
输入
- 输入包含一个5行5列的矩阵
输出
- 如果存在鞍点,输出鞍点所在的行、列及其值,如果不存在,输出"not found"
样例输入
11 3 5 6 9
12 4 7 8 10
10 5 6 9 11
8 6 4 7 2
15 10 11 20 25
样例输出
4 1 8
思考
- 注解就够了!!
AC
#include <iostream>
using namespace std;
#define n 5
int a[n][n];
int main(){
int max,min,ni,nj,count=0;
for(int i=0;i<n;i++){
for(int j=0;j<n;j++){
scanf("%d",&a[i][j]);
}
}
for(int i=0;i<n;i++){
max=a[i][0]; //初始化最大
for(int j=0;j<n;j++){//每行的最大值
if(a[i][j]>=max){
ni=i;
nj=j;
max=a[i][j];
}
}
min=max; //初始化最小
for(int k=0;k<n;k++){ //所在列的最小值。
if(a[k][nj]<min){
min=a[k][nj];
}
}
if(max==min){ //判断是否符合条件
count=1;
printf("%d %d %d\n",ni+1,nj+1,max);
break;
}
}
if(count==0) printf("not found\n");
return 0;
}
006:图像模糊处理
- 总时间限制: 1000ms 内存限制: 65536kB
描述
给定n行m列的图像各像素点的灰度值,要求用如下方法对其进行模糊化处理:
-
四周最外侧的像素点灰度值不变;
-
中间各像素点新灰度值为该像素点及其上下左右相邻四个像素点原灰度值的平均(舍入到最接近的整数)。
输入
- 第一行包含两个整数n和m,表示图像包含像素点的行数和列数。1 <= n <= 100,1 <= m <= 100。
- 接下来n行,每行m个整数,表示图像的每个像素点灰度。相邻两个整数之间用单个空格隔开,每个元素均在0~255之间。
输出
- n行,每行m个整数,为模糊处理后的图像。相邻两个整数之间用单个空格隔开。
样例输入
4 5
100 0 100 0 50
50 100 200 0 0
50 50 100 100 200
100 100 50 50 100
样例输出
100 0 100 0 50
50 80 100 60 0
50 80 100 90 200
100 100 50 50 100
思考
-
四周最外侧的像素点灰度值不变;
-
中间各像素点新灰度值为该像素点及其上下左右相邻四个像素点原灰度值的平均(舍入到最接近的整数)。
-
Round函数返回一个数值,该数值是按照指定的小数位数进行四舍五入运算的结果。
AC
/*
Round函数返回一个数值,该数值是按照指定的小数位数进行四舍五入运算的结果。
*/
#include <iostream>
#include <stdio.h>
#include <cmath>
using namespace std;
#define N 100
int n,m;
double a[N][N];
int b[N][N];
int main(){
scanf("%d %d",&n,&m);
for(int i=0;i<n;i++){ //读入数组
for(int j=0;j<m;j++){
scanf("%lf",&a[i][j]);
}
}
for(int i=0;i<n;i++){
if(i==0 || i==n-1){//外围行不变
for(int j=0;j<m;j++){
b[i][j]=(int)a[i][j];
}
}else{
for(int j=0;j<m;j++){
if(j==0||j==m-1){ //外围列不变
b[i][j]=(int)a[i][j];
}else{ //内圈求平均值
b[i][j]=round((a[i-1][j]+a[i][j-1]+a[i][j+1]+a[i+1][j]+a[i][j])/5);
}
}
}
}
for(int i=0;i<n;i++){ //输出数组
for(int j=0;j<m;j++){
printf("%d ",b[i][j]);
}
printf("\n");
}
return 0;
}
007:矩阵转置
- 总时间限制: 1000ms 内存限制: 65536kB
描述
- 输入一个n行m列的矩阵A,输出它的转置AT。
输入
- 第一行包含两个整数n和m,表示矩阵A的行数和列数。1 <= n <= 100,1 <= m <= 100。
- 接下来n行,每行m个整数,表示矩阵A的元素。相邻两个整数之间用单个空格隔开,每个元素均在1~1000之间。
输出
- m行,每行n个整数,为矩阵A的转置。相邻两个整数之间用单个空格隔开。
样例输入
3 3
1 2 3
4 5 6
7 8 9
样例输出
1 4 7
2 5 8
3 6 9
思考
- 逆序一维数组的基础加以改变!!!
AC
#include <iostream>
using namespace std;
#define N 100
int n,m;
int a[N][N];
int main(){
scanf("%d %d",&n,&m);
for(int i=0;i<n;i++){
for(int j=0;j<m;j++){
scanf("%d",&a[i][j]);
}
}
for(int i=0;i<m;i++){
for(int j=0;j<n;j++){ //矩阵转置后行数和例数也随之转置
printf("%d ",a[j][i]);
}
printf("\n");
}
return 0;
}
第五周全部题解,🆗。