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

第五章 数组

第一节 一维数组

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

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

【题目描述】

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

【输入】

  输入包含三行:

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

  第二行为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个苹果到地面的高度,以及陶陶把手伸直的时候能够达到的最大高度,请帮陶陶算一下她能够摘到的苹果的数目。假设她碰到苹果,苹果就会掉下来。

【输入】

  包括两行数据。第一行包含101010100100100200200200之间(包括100100100200200200)的整数(单位:厘米)分别表示101010个苹果到地面的高度,两个相邻的整数之间用一个空格隔开。第二行只包括一个100100100120120120之间(包括100100100120120120)的整数(单位:厘米),表示陶陶把手伸直的时候能够达到的最大高度。

【输出】

  包括一行,这一行只包含一个整数,表示陶陶能够摘到的苹果的数目。

【输入样例】
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&lt;n&lt;100)n(1&lt;n&lt;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,61018,1935,3660,61以上(含616161)四个年龄段统计的患病人数占总患病人数的比例。

【输入】

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

【输出】

  按照0−18,19−35,36−60,610-18,19-35,36-60,61018,1935,3660,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(1L10000),M(1M100)LLL代表马路的长度,MMM代表区域的数目,LLLMMM之间用一个空格隔开。接下来的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(1n1000)

  第二行包含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(N5000)盏灯,从111NNN按顺序依次编号,初始时全部处于开启状态;有MMM个人(MMM为不大于NNN的正整数)也从111MMM依次编号。

  第一个人将灯全部关闭,第二个人将编号为222的倍数的灯打开,第三个人将编号为333的倍数的灯做相反处理(即将打开的灯关闭,将关闭的灯打开)。依照编号递增顺序,以后的人都和333号一样,将凡是自己编号倍数的灯做相反处理。

  请问:当第MMM个人操作之后,哪几盏灯是关闭的,按从小到大输出其编号,其间用逗号间隔。

【输入】

  输入正整数NNNMMM,以单个空格隔开。

【输出】

  顺次输出关闭的灯的编号,其间用逗号间隔。

【输入样例】
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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值