蓝桥等考-中级-一维数组-练习
蓝桥等考-中级-一维数组-练习
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;
}
作者:newcode 更多资源请关注纽扣编程微信公众号
从事机器人比赛、机器人等级考试、少儿scratch编程、信息学奥赛等研究学习