信息学奥赛一本通(C++版)第一部分 C++语言 第五章 数组

第五章 数组

第一节 一维数组

T1102 : 与指定数字相同的数的个数

时间限制: 1000 ms 内存限制: 65536 KB

【题目描述】

  输出一个整数序列中与指定数字相同的数的个数。

【输入】

  输入包含三行:

  第一行为 N ( N ≤ 100 ) N(N≤100) N(N100),表示整数序列的长度;

  第二行为 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 &lt; n &lt; 100 ) n(1&lt;n&lt;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 018,1935,3660,61以上(含 61 61 61)四个年龄段统计的患病人数占总患病人数的比例。

【输入】

  共 2 2 2行,第一行为过往病人的数目 n ( 0 &lt; n ≤ 100 ) n(0&lt;n≤100) n(0<n100),第二行为每个病人患病时的年龄。

【输出】

  按照 0 − 18 , 19 − 35 , 36 − 60 , 61 0-18,19-35,36-60,61 018,1935,3660,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(1L10000),M(1M100) 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(1n1000)

  第二行包含 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(N5000)盏灯,从 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
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值