题目描述 牛村新开了一个系列赛,一个系列赛有m场比赛,比赛规则是解题数越多排名越前,如果前几名队伍解题数一样则会并列第一。
有n个神仙队伍完整参加了m场比赛,请问有几个队伍拿过第一名。

输入描述:
第一行输入两个整数n,m,表示队伍数量与m场比赛。

接下来n行输入一个数字矩阵,每行m个数字字符表示每场比赛的解题数量
1<=n,m<=100
输出描述:
输出一个整数表示拿过第一名的队伍数量

输入

3 5
91728
11828
11111

输出

3

思路:

  • 首先利用二维数组存储每组比赛的解题数量
  • 明白他不管到底那一次获得第一,要计算的是他的队伍数,而不是获胜的场次
  • 也就是说只要这个队伍有一次这个获得第一名就记录
  • 紧接着判断那一列有最大值,并且记录
  • 再找出这个最大值出自哪一列,找见就记录加一并且跳出
  • 然后输出这个值

代码描述1

#include <stdio.h>
#include <stdlib.h>
int main() {
int n=0,m=0;
scanf("%d%d",&n,&m);
int i,j;
int a[100][100];
int b[100][100]={0};
int temp[100]={0};
//因为是字符数字,所以有%1d
for(i=0;i<n;i++){
for(j=0;j<m;j++){
scanf("%1d",&a[i][j]);
}
}
//找出每列的最大值
for(i=0,j=0;j<m;j++){
while(i<n){
if(a[i][j]>temp[j]){
temp[j]=a[i][j];
}
i++;
}
i=0;
}
//找出中最大值的位置
for(i=0,j=0;j<m;j++){
while(i<n){
if(temp[j]==a[i][j]){
b[i][j]=1;
}
i++;
}
i=0;
}
int sum=0;
//统计这个位置在哪一组
for(i=0;i<n;i++){
for(j=0;j<m;j++){
if(b[i][j]==1){
sum++;
break;
}
}
}
printf("%d",sum);
return 0;
}

代码描述2

#include <stdio.h>
int main (){
int i,j,n,m,x=0,max;
int a[100][100]={0},b[100]={0};
scanf("%d%d",&n,&m);

for(i=0;i<n;i++){
for(j=0;j<m;j++){
scanf("%1d",&a[i][j]);
}
}

for(j=0;j<m;j++){
max=-1;
for(i=0;i<n;i++){
if(max<a[i][j]){
max=a[i][j];
}
}
for(i=0;i<n;i++){
if(a[i][j]==max){
b[i]++;
}
}
}

for(i=0;i<n;i++){
if(b[i]>0){
x++;
}
}

printf("%d",x);
return 0;
}