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; }
实测输出正确
拜了个拜……