第1关:数组合并
任务描述
本关任务:合并两个有序数组。
有两个元素非递减的数组a和数组b,请你将它们合并成数组c,其数组元素依然是非递减的。
编程要求
右侧编辑器中有一个函数Merge
,它有以下5
个参数:
int a[]
:第一个非递减数组。int alen
:数组a
的长度。int b[]
:第二个非递减数组。int blen
:数组b
的长度。int c[]
:前两个数组的内容合并到此数组中,保证空间足够。
输入数据由评测系统读取,并传递给Merge
函数,在调用完此函数之后,会打印数组c
中的内容,具体见测试说明。
测试说明
平台会对你编写的代码进行测试:
测试输入: 4 1 1 2 3
(第一个数组有4
个元素,分别是1 1 2 3
) 3 0 5 7
(第二个数组有3
个元素,分别是0 5 7
) 预期输出: 0 1 1 2 3 5 7
测试输入: 1 5
3 1 2 6
预期输出: 1 2 5 6
每组输入有两行,每一行为一个数组的内容。每行第一个数n
代表数组长度,之后n
个数为此数组中的内容。
#include <iostream>
using namespace std;
void Merge(int a[],int alen,int b[],int blen,int c[])
{
/********** Begin **********/
int i,j,min,temp;
scanf("%d",&alen);
for(i=0;i<alen;i++)
scanf("%d",&a[i]);
scanf("%d",&blen);
for(i=0;i<blen;i++)
scanf("%d",&b[i]);
for(i=0;i<(alen+blen);i++)
{
if(i<alen)
c[i]=a[i];
else c[i]=b[i-alen];
}
for(i=0;i<(alen+blen);i++ )
{
min=i;
for(j=i+1;j<(alen+blen);j++)
{
if(c[j]<c[min])
min=j;
}
temp=c[min];
c[min]=c[i];
c[i]=temp;
}
/********** End **********/
}
第2关:数组的TopK
任务描述
本关任务:输出数组的最大k个数。
给定一个数组a,请从大到小输出这个数组中的最大k个数。
注意,数组不是有序的。
编程要求
右侧编辑器有一个函数TopK
,它三个参数a
、alen
和k
,分别代表要处理的数组、这个数组的长度以及要求的**k
个数**。
k
不大于数组长度。
请计算最大k个数,并输出,每一个数占一行。
输入数据由评测系统读取并传递给TopK
函数,具体见测试说明。
测试说明
平台会对你编写的代码进行测试:
测试输入: 3 1 2 1 3
(数组长度为3
,要求输出数组中最大的1
个元素,2 1 3
为数组内容) 预期输出: 3
测试输入: 3 2 2 1 3
(数组长度为3
,要求输出数组中最大的2
个元素,2 1 3
为数组内容) 预期输出: 3
2
每组输入有一行,第一个数n
代表数组的长度,第二个数k
为要求的最大k
个数,之后n
个数为数组内容。
#include <iostream>
using namespace std;
void TopK(int a[],int alen,int k)
{
/********** Begin **********/
int i,j,temp,max;
scanf("%d",&alen);
scanf("%d",&k);
for(i=0;i<alen;i++)
scanf("%d",&a[i]);
for(i = 0;i<alen;i++ )
{
max=i;
for(j=i+1;j<alen;j++)
{
if(a[j]>a[max])
max=j;
}
temp=a[max];
a[max]=a[i];
a[i]=temp;
}
for(i=0;i<=k-1;i++)
printf("%d\n",a[i]);
/********** End **********/
}
第3关:矩阵加法
任务描述
本关任务:计算两个矩阵的加法。
有两个行列数相同的矩阵A和B,请计算A+B矩阵的值,并将其输出。
编程要求
右侧编辑器有一个函数Add
,请在此函数中读取数据,完成计算,输出结果。
输入数据只有三行,第一行有两个数N,M,代表矩阵的行数和列数,并且有0<N,M<5。
之后两行每行有N×M个数,代表两个矩阵的内容,由每一行首尾相连拼接成。
输入的数据由学员自行读取。
输出矩阵时按照矩形的形状输出,数与数之间用一个空格隔开。为了简单起见,每一行最后的数后面也有一个空格。具体见测试说明。
测试说明
平台会对你编写的代码进行测试:
测试输入: 2 2
1 2 3 4
1 1 1 1
预期输出: 2 3
4 5
测试输入: 1 2
-1 -1
1 1
预期输出: 0
0
注:关于首尾相连的含义,以第一组为例,输入的两个矩阵分别为: 1 2
3 4
1 1
1 1
#include <iostream>
using namespace std;
void Add()
{
/********** Begin **********/
int a,b,c,d,e;
int ask1[100][100]={0};
int ask2[100][100]={0};
int ask3[100][100]={0};
scanf("%d%d",&a,&e);
for(b=0;b<a;b++)
{
for(c=0;c<e;c++)
{
scanf("%d",&ask1[b][c]);
}}
for(b=0;b<a;b++)
{
for(c=0;c<e;c++)
{
scanf("%d",&ask2[b][c]);
}}
for(b=0;b<a;b++)
{
for(c=0;c<e;c++)
{
ask3[b][c]=ask1[b][c]+ask2[b][c];
}}
for(b=0;b<a;b++)
{
for(c=0;c<e;c++)
{
if(c==e-1)
printf("%d ",ask3[b][c]);
else
printf("%d ",ask3[b][c]);
}
printf("\n");
}
/********** End **********/
}
第4关:排队挂号
任务描述
本关任务:输出下一个病人所挂号的医生的编号。
某医院有n位接诊的医师,编号为1到n。
如果有病人进来,负责挂号的医师会将其安排在排队人数最少的医生那里,如果有多个医生的排队人数都是最少的,那就安排在编号较小的那一个。
现在告诉你每个医生的排队情况,请你判断下一个病人来时,应该安排在哪一个医生那里。
编程要求
右侧编辑器有一个函数Next
,它有两个参数arr
和n
,arr
是数组,存有每个医生前的排队人数,n
是医生的数量(即arr
数组的长度)。
请计算并输出下一个病人挂号的医生的编号,输出占一行。
输入的数据由评测系统读取,并传递给Next
函数。具体见测试说明。
测试说明
平台会对你编写的代码进行测试:
测试输入: 3
(医生数量) 2 1 3
(对应1-3
号医生的排队人数) 预期输出: 2
(表示去2
号医生那排队)
测试输入: 3
2 2 2
预期输出: 1
每组输入分两行,第一行是医生的数量n
,第二行有n
个数,代表每一个医生前面的排队人数。
#include <iostream>
using namespace std;
void Next(int arr[],int n)
{
/********** Begin **********/
int i,j,min;
scanf("%d",&n);
for(i=0;i<n;i++)
scanf("%d",&arr[i]);
for(i=0;i<n;i++)
{
min=i;
for(j=i+1;j<n;j++)
{
if(arr[j]<arr[min])
min=j;
}
break;
}
printf("%d\n",min+1);
/********** End **********/
}