练习,监考老师
监考老师
描述
在一个大试场里,有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;
}