Educoder平台 程序设计部分 C程序中的数组习题

第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 33 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,它三个参数aalenk,分别代表要处理的数组、这个数组的长度以及要求的**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,它有两个参数arrnarr是数组,存有每个医生前的排队人数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   **********/

}

  • 1
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 3
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值