Dream To Me

总有些什么留下来并被惦记

练习,监考老师


监考老师


描述

在一个大试场里,有n行m列的考生,小王和众多同学正在考试,这时,有一部分考生作弊,当然,监考老师能发现他们。但是只有一个监考老师,他由于高度近视,只能发现与他同行同列的作弊者,而且由于监考老师年老体弱,在考试过程中无法移动。现在已知n*m个考生中谁在作弊,请帮监考老师找一个位置,可以发现最多的作弊者(监考老师可以和某个考生在同一位置)。如果监考老师的位置上的考生在作弊,那么监考老师先前后看,发现他作弊,再左右看,又发现他作弊,算做发现2个考生作弊


数据范围

对于50 %的数据,0<n,m<=10,对于100 %的数据,0<n,m<=100,所有数据都在longint范围内.


样例输入

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次

输入格式

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

输出格式

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


思路:

  找纵列最多作弊的人数,加起来。。。这种题为什么还有人WA?一开始还以为动规来着。。。但是很费解为什么不能开数组来保存每行每列的作弊人数。。那地方死活调不过去,最后只能直接用一个变量代替了,不过也不是什么很困难的。。思路而已


AC Code:

#include <iostream>
#define max(a,b) (a>b?a:b)
using namespace std;
int main()
{
  int n,m,i,j;
  bool desk[100][100];
  int x=0,y=0,max=0,may=0;
  cin>>n>>m;
  for(i=0;i<n;i++)
    for(j=0;j<m;j++)
     cin>>desk[i][j];
  for(i=0;i<n;i++)
    {
    for(j=0;j<m;j++)
     if(desk[i][j])
       x++;
    max=max(max,x);
    x=0; 
    }
  for(j=0;j<m;j++)
    {
    for(i=0;i<n;i++)
     if(desk[i][j])
       y++;
    may=max(may,y);
    y=0; 
    }
  cout<<max+may<<endl;
  system("pause");
  return 0;
}