蓝桥等考-中级-一维数组-练习

蓝桥等考-中级-一维数组-练习

OpenJudge-1.6-01 与指定数字相同的数的个数

描述

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

输入

输入包含三行:
第一行为N,表示整数序列的长度(N <= 100);
第二行为N个整数,整数之间以一个空格分开;
第三行包含一个整数,为指定的整数m。

输出

输出为N个数中与m相同的数的个数。

样例输入

3
2 3 2
2

样例输出

2

解题思路

参考程序

#include<bits/stdc++.h>
using namespace std;
int a[105],n,m,ans;
int main(){
	cin>>n;//输入数的个数到n
	for(int i=0;i<n;i++){//输入n个数 到a数组 
		cin>>a[i];
	}
	cin>>m;//输入要查找的数m 
	for(int i=0;i<n;i++){//遍历n个数 
		if(a[i]==m){//找到m 累加个数到ans 
			ans++;
		}
	}
	cout<<ans;
}

OpenJudge-1.6-04 数组逆序重放

描述

将一个数组中的值按逆序重新存放。例如,原来的顺序为8,6,5,4,1。要求改为1,4,5,6,8。

输入

输入为两行:第一行数组中元素的个数n(1<n<100),第二行是n个整数,每两个整数之间用空格分隔。

输出

输出为一行:输出逆序后数组的整数,每两个整数之间用空格分隔。

样例输入

5
8 6 5 4 1

样例输出

1 4 5 6 8

解题思路

参考程序

#include<bits/stdc++.h>
using namespace std;

int a[100];
int main(){
	int n,t;
	scanf("%d",&n);
	for(int i=1;i<=n;i++){
		scanf("%d",&a[i]);
	}
	for(int i=1;i<=n/2;i++){//交换n/2次 
		swap(a[i],a[n+1-i]);//a[i]与a[n+1-i] 交换  1与n交换  2与n-1交换 
	}
	for(int i=1;i<=n;i++){
		printf("%d ",a[i]);
	}
	return 0;
}

OpenJudge-1.6-05 年龄与疾病

描述

某医院想统计一下某项疾病的获得与否与年龄是否有关,需要对以前的诊断记录进行整理,按照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%

解题思路

参考程序

#include<bits/stdc++.h>
using namespace std;

int a[1000];
int main(){
	int n;
	//a1,a2,a3,a4每个年龄人数 
	//b1,b2,b3,b4每个年龄段百分比 
	double b1,b2,b3,b4,a1=0,a2=0,a3=0,a4=0;
	cin>>n;
	for(int i=1;i<=n;i++){
		cin>>a[i];
		if(a[i]<=18){
			a1++;
		}else if(a[i]<=35){
			a2++;
		}else if(a[i]<=60){
			a3++;
		}else if(a[i]>=60){
			a4++;
		}
	}
	b1=a1/n*100;
	b2=a2/n*100;
	b3=a3/n*100;
	b4=a4/n*100;
	// %.2f 保留两位小数  %% 输出一个%  \n 换行
	printf("%.2f%%\n",b1); 
	printf("%.2f%%\n",b2);
	printf("%.2f%%\n",b3);
	printf("%.2f%%\n",b4);
	return 0;
} 

OpenJudge-1.6-06 校门外的树

描述

某校大门外长度为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

解题思路

参考程序

#include<bits/stdc++.h>
using namespace std;

int main(){
	int a[10001];
	int l,m,x,y,s=0;
	scanf("%d%d",&l,&m);
	for(int i=0;i<=l;i++){// 0-l包括l+1种树位置 
		a[i]=1;//都赋值为1表示都种树 
	}
	for(int i=1;i<=m;i++){//m段修地铁 
		scanf("%d%d",&x,&y);//每段起始 
		for(int j=x;j<=y;j++){//每段起始位置包括中间数都不能种树 
			a[j]=0;//不能种树的地方设置为0 可能有重复的多次设置为0 
		}
	}
	for(int i=0;i<=l;i++){// 0-l包括l+1种树位置 
		if(a[i]==1) s++; //可以种树的位置累加到s 
	}
	printf("%d",s);
	return 0;
}

OpenJudge-1.6-07 有趣的跳跃

描述

一个长度为n(n>0)的序列中存在“有趣的跳跃”当前仅当相邻元素的差的绝对值经过排序后正好是从1到(n-1)。例如,1 4 2 3存在“有趣的跳跃”,因为差的绝对值分别为3,2,1。当然,任何只包含单个元素的序列一定存在“有趣的跳跃”。你需要写一个程序判定给定序列是否存在“有趣的跳跃”。

输入

一行,第一个数是n(0 < n < 3000),为序列长度,接下来有n个整数,依次为序列中各元素,各元素的绝对值均不超过1,000,000,000。

输出

一行,若该序列存在“有趣的跳跃”,输出"Jolly",否则输出"Not jolly"。

样例输入

4 1 4 2 3

样例输出

Jolly

解题思路

参考程序

#include<bits/stdc++.h>
using namespace std;
//a数组存储所有数 b数组存放相邻差 
int a[3001],b[3001],n;
int main(){
	cin>>n;
	for(int i=1;i<=n;i++){
		cin>>a[i];
	}
	for(int i=1;i<n;i++){//b[1]为a[1]与a[2]的差 b[n-1]为a[n-1]与a[n]的差 
		b[i]=abs(a[i]-a[i+1]);
	}
	sort(b,b+n);//从0开始对n-1个数进行排序 第一个为0 排在最前面 升序 
	for(int i=1;i<n;i++){//从第一个开始 b[i]和i相同才符合要求 
		if(b[i]!=i){//找到不同的结束 
			cout<<"Not jolly";
			return 0;
		}
	}
	cout<<"Jolly";//没有找到不同的 输出 
	return 0;
}

OpenJudge-1.6-08 石头剪刀布

描述

石头剪刀布是常见的猜拳游戏。石头胜剪刀,剪刀胜布,布胜石头。如果两个人出拳一样,则不分胜负。

一天,小A和小B正好在玩石头剪刀布。已知他们的出拳都是有周期性规律的,比如:“石头-布-石头-剪刀-石头-布-石头-剪刀……”,就是以“石头-布-石头-剪刀”为周期不断循环的。请问,小A和小B比了N轮之后,谁赢的轮数多?

输入

输入包含三行。
第一行包含三个整数:N,NA,NB,分别表示比了N轮,小A出拳的周期长度,小B出拳的周期长度。0 < N,NA,NB < 100。
第二行包含NA个整数,表示小A出拳的规律。
第三行包含NB个整数,表示小B出拳的规律。
其中,0表示“石头”,2表示“剪刀”,5表示“布”。相邻两个整数之间用单个空格隔开。

输出

输出一行,如果小A赢的轮数多,输出A;如果小B赢的轮数多,输出B;如果两人打平,输出draw。

样例输入

10 3 4
0 2 5
0 5 0 2

样例输出

A

提示

对于测试数据,猜拳过程为:
A:0 2 5 0 2 5 0 2 5 0
B:0 5 0 2 0 5 0 2 0 5
A赢了4轮,B赢了2轮,双方打平4轮,所以A赢的轮数多

解题思路

参考程序

#include<bits/stdc++.h>
using namespace std;

int n,na,nb;
int a[105],b[105];

int main(){
	cin>>n>>na>>nb;
	for(int i=0;i<na;i++){
		cin>>a[i];
	}
	
	for(int i=0;i<nb;i++){
		cin>>b[i];
	}
	int ai=0,bi=0,acnt=0,bcnt=0;
	for(int i=0;i<n;i++){
		if(a[ai]==0){
			if(b[bi]==2){
				acnt++;
			}else if(b[bi]==5){
				bcnt++;
			}
		}else if(a[ai]==2){
			if(b[bi]==5){
				acnt++;
			}else if(b[bi]==0){
				bcnt++;
			}
		}else if(a[ai]==5){
			if(b[bi]==0){
				acnt++;
			}else if(b[bi]==2){
				bcnt++;
			}
		}
		ai++,bi++;
		if(ai==na){
			ai=0;
		}
		if(bi==nb){
			bi=0;
		}
		
	}
	
	if(acnt>bcnt){
		cout<<"A";
	}else if(acnt<bcnt){
		cout<<"B";
	}else{
		cout<<"draw";
	}
	return 0;
} 

OpenJudge-1.6-09 向量点积计算

描述

在线性代数、计算几何中,向量点积是一种十分重要的运算。

给定两个n维向量a=(a1,a2,...,an)和b=(b1,b2,...,bn),求点积a·b=a1b1+a2b2+...+anbn。

输入

第一行是一个整数n。1 <= n <= 1000。
第二行包含n个整数a1,a2,...,an。
第三行包含n个整数b1,b2,...,bn。
相邻整数之间用单个空格隔开。每个整数的绝对值都不超过1000。

输出

一个整数,即两个向量的点积结果。

样例输入

3
1 4 6
2 1 5

样例输出

36

解题思路

参考程序

#include<bits/stdc++.h>
using namespace std;

const int N=1005;
int n,a[N],b[N],ans;
int main(){
	cin>>n;
	for(int i=0;i<n;i++){
		cin>>a[i];
	}
	for(int i=0;i<n;i++){
		cin>>b[i];
	}
	for(int i=0;i<n;i++){
		ans+=a[i]*b[i];
	}
	cout<<ans;
	return 0;
} 

OpenJudge-1.9-07 不与最大数相同的数字之和

描述

输出一个整数数列中不与最大数相同的数字之和。

输入

输入分为两行:
第一行为N(N为接下来数的个数,N <= 100);
第二行为N个整数,数与数之间以一个空格分开,每个整数的范围是-1000,000到1000,000。

输出

输出为N个数中除去最大数其余数字之和。

样例输入

3
1 2 3 

样例输出

3

解题思路

参考程序

#include<bits/stdc++.h>
using namespace std;

int n,a[105],maxN=-1000001,ans;
int main(){
	cin>>n;
	
	for(int i=0;i<n;i++){
		cin>>a[i];
		if(a[i]>maxN){
			maxN=a[i];
		}
	}
	
	for(int i=0;i<n;i++){
		if(a[i]!=maxN){
			ans+=a[i];
		}
	}
	cout<<ans;
	return 0;
}
posted @ 2023-03-16 18:44  new-code  阅读(82)  评论(0编辑  收藏  举报