第五章 数组
第一节 一维数组
T1102 : 与指定数字相同的数的个数
时间限制: 1000 ms 内存限制: 65536 KB
【题目描述】
输出一个整数序列中与指定数字相同的数的个数。
【输入】
输入包含三行:
第一行为N(N≤100)N(N≤100)N(N≤100),表示整数序列的长度;
第二行为NNN个整数,整数之间以一个空格分开;
第三行包含一个整数,为指定的数字mmm。
【输出】
输出为NNN个数中与mmm相同的数的个数。
【输入样例】
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
【题目描述】
陶陶家的院子里有一棵苹果树,每到秋天树上就会结出101010个苹果。苹果成熟的时候,陶陶就会跑去摘苹果。陶陶有个303030厘米高的板凳,当她不能直接用手摘到苹果的时候,就会踩到板凳上再试试。
现在已知101010个苹果到地面的高度,以及陶陶把手伸直的时候能够达到的最大高度,请帮陶陶算一下她能够摘到的苹果的数目。假设她碰到苹果,苹果就会掉下来。
【输入】
包括两行数据。第一行包含101010个100100100到200200200之间(包括100100100和200200200)的整数(单位:厘米)分别表示101010个苹果到地面的高度,两个相邻的整数之间用一个空格隔开。第二行只包括一个100100100到120120120之间(包括100100100和120120120)的整数(单位:厘米),表示陶陶把手伸直的时候能够达到的最大高度。
【输出】
包括一行,这一行只包含一个整数,表示陶陶能够摘到的苹果的数目。
【输入样例】
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.928.928.9元/本
数据结构与算法32.732.732.7元/本
数字逻辑45.645.645.6元/本
C++
程序设计教程787878元/本
人工智能353535元/本
计算机体系结构86.286.286.2元/本
编译原理27.827.827.8元/本
操作系统434343元/本
计算机网络565656元/本
JAVA
程序设计656565元/本
给定每种图书购买的数量,编程计算应付的总费用。
【输入】
输入一行,包含101010个整数,分别表示购买的《计算概论》、《数据结构与算法》、《数字逻辑》、《C++程序设计教程》、《人工智能》、《计算机体系结构》、《编译原理》、《操作系统》、《计算机网络》、《JAVA程序设计》
的数量(以本为单位)。每两个整数用一个空格分开。
【输出】
输出一行,包含一个浮点数fff,表示应付的总费用。精确到小数点后一位。
【输入样例】
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,18,6,5,4,18,6,5,4,1。要求改为1,4,5,6,81,4,5,6,81,4,5,6,8。
【输入】
输入为两行:第一行数组中元素的个数n(1<n<100)n(1<n<100)n(1<n<100),第二行是nnn个整数,每两个整数之间用空格分隔。
【输出】
输出为一行:输出逆序后数组的整数,每两个整数之间用空格分隔。
【输入样例】
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,610-18,19-35,36-60,610−18,19−35,36−60,61以上(含616161)四个年龄段统计的患病人数占总患病人数的比例。
【输入】
共222行,第一行为过往病人的数目n(0<n≤100)n(0<n≤100)n(0<n≤100),第二行为每个病人患病时的年龄。
【输出】
按照0−18,19−35,36−60,610-18,19-35,36-60,610−18,19−35,36−60,61以上(含616161)四个年龄段输出该段患病人数占总患病人数的比例,以百分比的形式输出,精确到小数点后两位。每个年龄段占一行,共四行。
【输入样例】
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
【题目描述】
某校大门外长度为LLL的马路上有一排树,每两棵相邻的树之间的间隔都是111米。我们可以把马路看成一个数轴,马路的一端在数轴000的位置,另一端在LLL的位置;数轴上的每个整数点,即0,1,2,...,L0,1,2,...,L0,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),LLL代表马路的长度,MMM代表区域的数目,LLL和MMM之间用一个空格隔开。接下来的MMM行每行包含两个不同的整数,用一个空格隔开,表示一个区域的起始点和终止点的坐标。
对于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
【题目描述】
在线性代数、计算几何中,向量点积是一种十分重要的运算。给定两个nnn维向量a=(a1,a2,...,an),b=(b1,b2,...,bn)a=(a_1,a_2,...,a_n),b=(b_1,b_2,...,b_n)a=(a1,a2,...,an),b=(b1,b2,...,bn),求点积a?b=a1b1+a2b2+...+anbna?b=a_1b_1+a_2b_2+...+a_nb_na?b=a1b1+a2b2+...+anbn。
【输入】
第一行是一个整数n(1≤n≤1000)n(1≤n≤1000)n(1≤n≤1000);
第二行包含nnn个整数a1,a2,...,ana_1,a_2,...,a_na1,a2,...,an;
第三行包含nnn个整数b1,b2,...,bnb_1,b_2,...,b_nb1,b2,...,bn;
相邻整数之间用单个空格隔开。每个整数的绝对值都不超过100010001000。
【输出】
一个整数,即两个向量的点积结果。
【输入样例】
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)盏灯,从111到NNN按顺序依次编号,初始时全部处于开启状态;有MMM个人(MMM为不大于NNN的正整数)也从111到MMM依次编号。
第一个人将灯全部关闭,第二个人将编号为222的倍数的灯打开,第三个人将编号为333的倍数的灯做相反处理(即将打开的灯关闭,将关闭的灯打开)。依照编号递增顺序,以后的人都和333号一样,将凡是自己编号倍数的灯做相反处理。
请问:当第MMM个人操作之后,哪几盏灯是关闭的,按从小到大输出其编号,其间用逗号间隔。
【输入】
输入正整数NNN和MMM,以单个空格隔开。
【输出】
顺次输出关闭的灯的编号,其间用逗号间隔。
【输入样例】
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<=n;++i)
if(flag&&!l[i])
printf("%d",i),flag=false;
else if(!l[i])
printf(",%d",i);
putchar('\n');
return 0;
}
T1110 : 查找特定的值
时间限制: 1000 ms 内存限制: 65536 KB
【题目描述】
在一个序列(下标从11