一道简单的题目

Hello,大家好

又到了人民群众喜闻乐见的博客分享时间

今天我们要讲的是:

████(来源未知):监考老师这道题

 

先上题目描述

 

2.监考老师(teacher.cpp/in/out)

 

 

 
问题描述

 

在一个大试场里,有 n 行 m 列的考生,小王和众多同学正在考试,这时,有一部分考生

 

作弊,当然,监考老师能发现他们。但是只有一个监考老师,他由于高度近视,只能发现与

 

他同行同列的作弊者,而且由于监考老师年老体弱,在考试过程中无法移动。现在已知 n*m

 

个考生中谁在作弊,请帮监考老师找一个位置,可以发现最多的作弊者(监考老师可以和某

 

个考生在同一位置)。如果监考老师的位置上的考生在作弊,那么监考老师先前后看,发现

 

他作弊,再左右看,又发现他作弊,算做发现 2 个考生作弊。
(需要文件输入输出)

 

输入格式

 

第一行两个数 n,m ,表示试场是 n*m 的,接下来是 n*m 的矩阵,1 表示作弊,0 表示不作

 

弊。

 

输出格式

 

共一行,一个数,表示最多可以发现多少作弊者。

 

样例输入

 

5 5

 

0 0 1 0 0

 

0 0 1 0 0

 

1 1 1 1 1

 

0 0 1 0 0

 

0 0 1 0 0

 

样例输出

 

10

 

样例说明

 

监考老师在最中间,那个位置上的作弊者算作 2 次。
 
数据范围
对于 50 %的数据,0<n,m<=10
对于 100 %的数据,0<n,m<=100,所有数据都在 longint 范围内
 
 
这道题……
 
是最简单的
 
老师打的是0个*
 
意思就是说:老师只能看到同行同列的学生,同一个位置上的学生如果作弊算2次
最后这条很重要!!(无故剧透[滑稽])
 
那么这样,我们就可以开始推断了
 
首先先搭框架
 1 #include<iostream>
 2 #include<cstdio>
 3 using namespace std;
 4 int main()
 5 {
 6     
 7     
 8     
 9     return 0;
10 }

虽然这道题数据小,也不用非得C语言scanf/printf在那挤时间了

但是,cstdio还是得加

因为需要文件输入输出

不加的话……

那之后……就不难了

我们只要输入地图

 1 void teacher(int n,int m)
 2 {
 3     int max=0,max1=0,max2=0,max3=0;
 4     scanf("%d%d",&n,&m);
 5     for(int i=1;i<=n;i++)
 6     {
 7         for(int j=1;j<=m;j++)
 8         {
 9             scanf("%d",&a[i][j]);
10         }
11     }
12 }

再找出哪一列的作弊人数最多

 1 void teacher(int n,int m)
 2 {
 3     int max=0,max1=0,max2=0,max3=0;
 4     scanf("%d%d",&n,&m);
 5     for(int i=1;i<=n;i++)
 6     {
 7         for(int j=1;j<=m;j++)
 8         {
 9             scanf("%d",&a[i][j]);
10         }
11     }
12     for(int j=1;j<=m;j++)
13     {
14         int sum=0;
15         for(int i=1;i<=n;i++)
16         {
17             if(a[i][j]==1)
18             {
19                 sum++;
20             }
21         }
22         if(sum>max)
23         {
24             max=sum;
25             max1=j;
26         }
27     }
28 }

再找出哪一行作弊的人最多

 1 void teacher(int n,int m)
 2 {
 3     int max=0,max1=0,max2=0,max3=0;
 4     scanf("%d%d",&n,&m);
 5     for(int i=1;i<=n;i++)
 6     {
 7         for(int j=1;j<=m;j++)
 8         {
 9             scanf("%d",&a[i][j]);
10         }
11     }
12     for(int j=1;j<=m;j++)
13     {
14         int sum=0;
15         for(int i=1;i<=n;i++)
16         {
17             if(a[i][j]==1)
18             {
19                 sum++;
20             }
21         }
22         if(sum>max)
23         {
24             max=sum;
25             max1=j;
26         }
27     }
28     for(int i=1;i<=n;i++)
29     {
30         int sum=0;
31         for(int j=1;j<=m;j++)
32         {
33             if(a[i][j]==1)
34             {
35                 sum++;
36             }
37         }
38         if(sum>max2)
39         {
40             max2=sum;
41             max3=i;
42         }
43     }
44 }

最后加起来就行了

注意因为中间那一个作弊的算两次,所以不用减

 1 void teacher(int n,int m)
 2 {
 3     int max=0,max1=0,max2=0,max3=0;
 4     scanf("%d%d",&n,&m);
 5     for(int i=1;i<=n;i++)
 6     {
 7         for(int j=1;j<=m;j++)
 8         {
 9             scanf("%d",&a[i][j]);
10         }
11     }
12     for(int j=1;j<=m;j++)
13     {
14         int sum=0;
15         for(int i=1;i<=n;i++)
16         {
17             if(a[i][j]==1)
18             {
19                 sum++;
20             }
21         }
22         if(sum>max)
23         {
24             max=sum;
25             max1=j;
26         }
27     }
28     for(int i=1;i<=n;i++)
29     {
30         int sum=0;
31         for(int j=1;j<=m;j++)
32         {
33             if(a[i][j]==1)
34             {
35                 sum++;
36             }
37         }
38         if(sum>max2)
39         {
40             max2=sum;
41             max3=i;
42         }
43     }
44     cout<<max2+max;
45 } 

最后main函数调用一下再加freopen就行了

完整代码:

#include<cmath>
#include<cstdio>
#include<cstring>
#include<cstdlib>
#include<iomanip>
#include<iostream>
#include<algorithm>
using namespace std;
int a[100][100];
void teacher(int n,int m)
{
    int max=0,max1=0,max2=0,max3=0;
    scanf("%d%d",&n,&m);
    for(int i=1;i<=n;i++)
    {
        for(int j=1;j<=m;j++)
        {
            scanf("%d",&a[i][j]);
        }
    }
    for(int j=1;j<=m;j++)
    {
        int sum=0;
        for(int i=1;i<=n;i++)
        {
            if(a[i][j]==1)
            {
                sum++;
            }
        }
        if(sum>max)
        {
            max=sum;
            max1=j;
        }
    }
    for(int i=1;i<=n;i++)
    {
        int sum=0;
        for(int j=1;j<=m;j++)
        {
            if(a[i][j]==1)
            {
                sum++;
            }
        }
        if(sum>max2)
        {
            max2=sum;
            max3=i;
        }
    }
    cout<<max2+max;
} 
void main()
{
    freopen("teacher.in","r",stdin);
    freopen("teacher.out","w",stdout);
    int n,m;
    teacher(n,m);
    fclose(stdin);
    fclose(stdout);
    return 0;
} 

实测输出正确

拜了个拜……

 

原文地址:https://www.cnblogs.com/wwLucas-Blog-Welcome/p/12910756.html