第五章 数组
第一节 一维数组
T1102 : 与指定数字相同的数的个数
时间限制: 1000 ms 内存限制: 65536 KB
【题目描述】
输出一个整数序列中与指定数字相同的数的个数。
【输入】
输入包含三行:
第一行为 N ( N ≤ 100 ) N(N≤100) N(N≤100),表示整数序列的长度;
第二行为 N N N个整数,整数之间以一个空格分开;
第三行包含一个整数,为指定的数字 m m m。
【输出】
输出为 N N N个数中与 m m m相同的数的个数。
【输入样例】
3
2 3 2
2
【输出样例】
2
【答案&代码】
#include<cstdio>
int n,num[101],m;
int main(void){
register int i,sum=0;
scanf("%d",&n);
for(i=1;i<=n;++i)
scanf("%d",&num[i]);
scanf("%d",&m);
for(i=1;i<=n;++i)
if(num[i]==m)
++sum;
printf("%d\n",sum);
return 0;
}
T1103 : 陶陶摘苹果
时间限制: 1000 ms 内存限制: 65536 KB
【题目描述】
陶陶家的院子里有一棵苹果树,每到秋天树上就会结出 10 10 10个苹果。苹果成熟的时候,陶陶就会跑去摘苹果。陶陶有个 30 30 30厘米高的板凳,当她不能直接用手摘到苹果的时候,就会踩到板凳上再试试。
现在已知 10 10 10个苹果到地面的高度,以及陶陶把手伸直的时候能够达到的最大高度,请帮陶陶算一下她能够摘到的苹果的数目。假设她碰到苹果,苹果就会掉下来。
【输入】
包括两行数据。第一行包含 10 10 10个 100 100 100到 200 200 200之间(包括 100 100 100和 200 200 200)的整数(单位:厘米)分别表示 10 10 10个苹果到地面的高度,两个相邻的整数之间用一个空格隔开。第二行只包括一个 100 100 100到 120 120 120之间(包括 100 100 100和 120 120 120)的整数(单位:厘米),表示陶陶把手伸直的时候能够达到的最大高度。
【输出】
包括一行,这一行只包含一个整数,表示陶陶能够摘到的苹果的数目。
【输入样例】
100 200 150 140 129 134 167 198 200 111
110
【输出样例】
5
【答案&代码】
#include<cstdio>
int n,tall[11];
int main(void){
register int i,sum=0;
for(i=1;i<=10;++i)
scanf("%d",&tall[i]);
scanf("%d",&n);
for(i=1;i<=10;++i)
if(tall[i]<=n+30)
++sum;
printf("%d\n",sum);
return 0;
}
T1104 : 计算书费
时间限制: 1000 ms 内存限制: 65536 KB
【题目描述】
下面是一个图书的单价表:
计算概论 28.9 28.9 28.9元/本
数据结构与算法 32.7 32.7 32.7元/本
数字逻辑 45.6 45.6 45.6元/本
C++
程序设计教程 78 78 78元/本
人工智能 35 35 35元/本
计算机体系结构 86.2 86.2 86.2元/本
编译原理 27.8 27.8 27.8元/本
操作系统 43 43 43元/本
计算机网络 56 56 56元/本
JAVA
程序设计 65 65 65元/本
给定每种图书购买的数量,编程计算应付的总费用。
【输入】
输入一行,包含 10 10 10个整数,分别表示购买的《计算概论》、《数据结构与算法》、《数字逻辑》、《C++程序设计教程》、《人工智能》、《计算机体系结构》、《编译原理》、《操作系统》、《计算机网络》、《JAVA程序设计》
的数量(以本为单位)。每两个整数用一个空格分开。
【输出】
输出一行,包含一个浮点数 f f f,表示应付的总费用。精确到小数点后一位。
【输入样例】
1 5 8 10 5 1 1 2 3 4
【输出样例】
2140.2
【答案&代码】
#include<cstdio>
int b[10];
int main(void){
register int i;
for(i=0;i<10;++i)
scanf("%d",&b[i]);
float s=(b[0]*28.9)+(b[1]*32.7)+(b[2]*45.6)+(b[3]*78)+(b[4]*35)+(b[5]*86.2)+(b[6]*27.8)+(b[7]*43)+(b[8]*56)+(b[9]*65);
printf("%.1f\n",s);
return 0;
}
T1105 : 数组逆序重存放
时间限制: 1000 ms 内存限制: 65536 KB
【题目描述】
将一个数组中的值按逆序重新存放。例如,原来的顺序为 8 , 6 , 5 , 4 , 1 8,6,5,4,1 8,6,5,4,1。要求改为 1 , 4 , 5 , 6 , 8 1,4,5,6,8 1,4,5,6,8。
【输入】
输入为两行:第一行数组中元素的个数 n ( 1 < n < 100 ) n(1<n<100) n(1<n<100),第二行是 n n n个整数,每两个整数之间用空格分隔。
【输出】
输出为一行:输出逆序后数组的整数,每两个整数之间用空格分隔。
【输入样例】
5
8 6 5 4 1
【输出样例】
1 4 5 6 8
【答案&代码】
#include<cstdio>
#include<cmath>
int n,num[101];
int main(void){
register int i;
scanf("%d",&n);
for(i=1;i<=n;++i)
scanf("%d",&num[i]);
for(i=n;i>=1;--i)
printf("%d ",num[i]);
putchar('\n');
return 0;
}
T1106 : 年龄与疾病
时间限制: 1000 ms 内存限制: 65536 KB
【题目描述】
某医院想统计一下某项疾病的获得与否与年龄是否有关,需要对以前的诊断记录进行整理,按照 0 − 18 , 19 − 35 , 36 − 60 , 61 0-18,19-35,36-60,61 0−18,19−35,36−60,61以上(含 61 61 61)四个年龄段统计的患病人数占总患病人数的比例。
【输入】
共 2 2 2行,第一行为过往病人的数目 n ( 0 < n ≤ 100 ) n(0<n≤100) n(0<n≤100),第二行为每个病人患病时的年龄。
【输出】
按照 0 − 18 , 19 − 35 , 36 − 60 , 61 0-18,19-35,36-60,61 0−18,19−35,36−60,61以上(含 61 61 61)四个年龄段输出该段患病人数占总患病人数的比例,以百分比的形式输出,精确到小数点后两位。每个年龄段占一行,共四行。
【输入样例】
10
1 11 21 31 41 51 61 71 81 91
【输出样例】
20.00%
20.00%
20.00%
40.00%
【答案&代码】
#include<cstdio>
#include<cmath>
int n,sum[4],temp;
int main(void){
register int i;
scanf("%d",&n);
for(i=1;i<=n;++i){
scanf("%d",&temp);
if(temp<=18)
++sum[0];
else if(temp<=35)
++sum[1];
else if(temp<=60)
++sum[2];
else
++sum[3];
}
printf("%.2f%%\n%.2f%%\n%.2f%%\n%.2f%%\n",sum[0]*100.0/n,sum[1]*100.0/n,sum[2]*100.0/n,sum[3]*100.0/n);
return 0;
}
T1107 : 校门外的树
时间限制: 1000 ms 内存限制: 65536 KB
【题目描述】
某校大门外长度为 L L L的马路上有一排树,每两棵相邻的树之间的间隔都是 1 1 1米。我们可以把马路看成一个数轴,马路的一端在数轴 0 0 0的位置,另一端在 L L L的位置;数轴上的每个整数点,即 0 , 1 , 2 , . . . , L 0,1,2,...,L 0,1,2,...,L都种有一棵树。
由于马路上有一些区域要用来建地铁。这些区域用它们在数轴上的起始点和终止点表示。已知任一区域的起始点和终止点的坐标都是整数,区域之间可能有重合的部分。现在要把这些区域中的树(包括区域端点处的两棵树)移走。你的任务是计算将这些树都移走后,马路上还有多少棵树。
【输入】
第一行有两个整数 L ( 1 ≤ L ≤ 10000 ) , M ( 1 ≤ M ≤ 100 ) L(1≤L≤10000),M(1≤M≤100) L(1≤L≤10000),M(1≤M≤100), L L L代表马路的长度, M M M代表区域的数目, L L L和 M M M之间用一个空格隔开。接下来的 M M M行每行包含两个不同的整数,用一个空格隔开,表示一个区域的起始点和终止点的坐标。
对于 20 % 20\% 20%的数据,区域之间没有重合的部分;对于其它的数据,区域之间有重合的情况。
【输出】
包括一行,这一行只包含一个整数,表示马路上剩余的树的数目。
【输入样例】
500 3
150 300
100 200
470 471
【输出样例】
298
【答案&代码】
#include<cstdio>
#include<cmath>
bool tr[10001];
int l,m,t1,t2;
int main(void){
register int i,j,sum=0;
scanf("%d%d",&l,&m);
for(i=1;i<=m;++i){
scanf("%d%d",&t1,&t2);
for(j=t1;j<=t2;++j)
tr[j]=true;
}
for(i=0;i<=l;++i)
if(!tr[i])
++sum;
printf("%d\n",sum);
return 0;
}
T1108 : 向量点积计算
时间限制: 1000 ms 内存限制: 65536 KB
【题目描述】
在线性代数、计算几何中,向量点积是一种十分重要的运算。给定两个 n n n维向量 a = ( a 1 , a 2 , . . . , a n ) , b = ( b 1 , b 2 , . . . , b n ) a=(a_1,a_2,...,a_n),b=(b_1,b_2,...,b_n) a=(a1,a2,...,an),b=(b1,b2,...,bn),求点积 a ? b = a 1 b 1 + a 2 b 2 + . . . + a n b n a?b=a_1b_1+a_2b_2+...+a_nb_n a?b=a1b1+a2b2+...+anbn。
【输入】
第一行是一个整数 n ( 1 ≤ n ≤ 1000 ) n(1≤n≤1000) n(1≤n≤1000);
第二行包含 n n n个整数 a 1 , a 2 , . . . , a n a_1,a_2,...,a_n a1,a2,...,an;
第三行包含 n n n个整数 b 1 , b 2 , . . . , b n b_1,b_2,...,b_n b1,b2,...,bn;
相邻整数之间用单个空格隔开。每个整数的绝对值都不超过 1000 1000 1000。
【输出】
一个整数,即两个向量的点积结果。
【输入样例】
3
1 4 6
2 1 5
【输出样例】
36
【答案&代码】
#include<cstdio>
#include<cmath>
int n,a[1001],b[1001];
int main(void){
register int i,sum=0;
scanf("%d",&n);
for(i=1;i<=n;++i)
scanf("%d",&a[i]);
for(i=1;i<=n;++i)
scanf("%d",&b[i]);
for(i=1;i<=n;++i)
sum+=a[i]*b[i];
printf("%d\n",sum);
return 0;
}
T1109 : 开关灯
时间限制: 1000 ms 内存限制: 65536 KB
【题目描述】
假设有 N ( N ≤ 5000 ) N(N≤5000) N(N≤5000)盏灯,从 1 1 1到 N N N按顺序依次编号,初始时全部处于开启状态;有 M M M个人( M M M为不大于 N N N的正整数)也从 1 1 1到 M M M依次编号。
第一个人将灯全部关闭,第二个人将编号为 2 2 2的倍数的灯打开,第三个人将编号为 3 3 3的倍数的灯做相反处理(即将打开的灯关闭,将关闭的灯打开)。依照编号递增顺序,以后的人都和 3 3 3号一样,将凡是自己编号倍数的灯做相反处理。
请问:当第 M M M个人操作之后,哪几盏灯是关闭的,按从小到大输出其编号,其间用逗号间隔。
【输入】
输入正整数 N N N和 M M M,以单个空格隔开。
【输出】
顺次输出关闭的灯的编号,其间用逗号间隔。
【输入样例】
10 10
【输出样例】
1,4,9
【答案&代码】
#include<cstdio>
#include<cstring>
bool l[5001]
int n,m;
int main(void){
register bool flag=true;
register int i;
memset(l,true,sizeof(l));
scanf("%d%d",&n,&m);
for(i=1;i<=m;++i)
for(j=1;j<=n;++j)
if(j%i==0)
l[j]=!l[j];
for(i=1;i