题目:

某学校的期末考试共有n个学生参加,考试题目共m科。学校将会给一部分学生颁发单科成绩优秀奖,获奖学生需要满足的条件是某一科的成绩是所有学生中最高的或是最高之一。

请问学校应该给多少个学生颁发单科成绩优秀奖。

输入第一行包含两个正整数n和m,分别代表学生人数和考试科目数量。(n,m<=500)

输出

输出仅包含一个整数,表示获得单科成绩优秀奖的人数

样本输入

5 5

28 35 38 10 19 

4 76 72 38 86 

96 80 81 17 10

70 64 86 85 10

1 93 19 34 41

C语言代码:

首先先找到二维数组中的每一列的最大值,并记录最大值的行下标,将所有行下标存入一个数组d中。

#include<stdio.h>
#define N 500
#define M 500
int del_same(int date[],int n);
int main(void)
{
 int a[N][M];
 int n,m;
 int i,j,k;
// int sum=0;
// int max=0;
 printf("输入考生人数n和考试科目m:");
 scanf("%d %d",&n,&m);
 for(i=0;i<n;i++)
 {
  for(j=0;j<m;j++)
  {
   scanf("%d",&a[i][j]);
  }
  printf("\n");
  }
  int b[m],d[m];
  for(i=0;i<m;i++)
  {
   b[i]=a[0][i];
   for(j=0;j<n;j++)
   {
    if(a[j][i]>b[i])
    {
     b[i]=a[j][i];
     d[i]=j;
    }
   }
  printf("%d\n", b[i]);
  }
 for(i=0;i<m;i++)
 {
  for(j=i+1;j<m&&d[i]-d[j];j++)
  {
   if(!(j-m))
   {
    d[k++]=d[i];    
   }
  }
 }
 k=del_same(d,m);
 printf("%d",k);
  return 0;
 }

然后写一个子函数,用来删除存放行下标数组中重复的元素。并重新存放删除过重复元素的数。并返回新的数组的长度,即要求的表彰的人数。

 

int del_same(int date[],int n)

 

{

 

    int i,j,k=0;

 

    for(i=0;i<n;++i)//i用来遍历数组

 

    {

 

        for(j=i+1;j<n && date[i]-date[j];++j);

 

        if(!(j-n))//没有重复元素

 

            date[k++]=date[i];//可将date[]看作两个数组

 

    }

 

    return k;//返回删除后的有效长度

 

}

 删除数组中重复元素的参考程序:https://blog.csdn.net/qq2071114140/article/details/80490400?utm_medium=distribute.pc_relevant.none-task-blog-BlogCommendFromMachineLearnPai2-2.nonecase&depth_1-utm_source=distribute.pc_relevant.none-task-blog-BlogCommendFromMachineLearnPai2-2.nonecase