CF847G 题解
题目分析:
一共有 $n$ 个小组,每个小组都有 7 个课程,有可能有两个或两个以上的小组同时上课,但是一个教室只可以装下一个小组,问你如果要让所有小组都可以在教室上课,一共需要多少个教室?
上面的描述可能理解起来比较复杂,下面我来把他简化一下:
一共有 $n$ 行,每行7个数,让你求那一列的“1”最多,输出他的数量。
这样就很简单了,如果你还是不理解,可以继续看下面(会的话可以跳过下面这一段):
比如样例二:
一共 $n$ 个小组(用√表示要上课)
第1节课 | 第2节课 | 第3节课 | 第4节课 | 第5节课 | 第6节课 | 第7节课 | |
---|---|---|---|---|---|---|---|
小组1 | √ | √ | √ | √ | |||
小组2 | √ | √ | √ | ||||
小组3 | √ | √ | √ | √ |
我们可以发现,第七节课要上课的小组最多,有三个,所以输出是 3
。
题目难度:
个人认为是 入门
难度左右。
题目做法:
我的代码可能比其他大佬写的题解的代码要慢一点,但是跟好理解一点。
首先,当然是输入一个 $n$ 和 $n$ 行字符数组(我比较喜欢用字符数组,其实字符串也没问题):
scanf("%d",&n);
for(i=1;i<=n;++i){ //输入 n 行
cin>>ch[i]; //也可以用 scanf,但要注意是‘%s’
}
输入之后,我们要用一个二维数组,来枚举每一列,用max1
来记录最大值,代码如下:
for(i=0;i<=7;++i){ //枚举 7 列
for(j=0;j<=n;++j){ //枚举 n 行
if(ch[j][i]=='1') sum++; //如果是‘1’就累加
}
if(sum>max1) max1=sum; //如果大于了之前的最大值,则把 sum 赋给 max1
sum=0; //记住每个循环之后要清 0
}
最后,就是输出了,就一个数,很简单。
printf("%d",max1); //输出
完整代码:
#include<iostream>
#include<cstring>
#include<cstdio>
using namespace std;
int n,m,i,j,max1=-1,sum; //max1 刚开始是要定义为 -1
char ch[1001][8]; //n 的最大值为 1000
int main(){
scanf("%d",&n); //输入 n 行
for(i=1;i<=n;++i){
cin>>ch[i]; //也可以用 scanf,但要注意是‘%s’
}
for(i=0;i<=7;++i){ //枚举 7 列
for(j=0;j<=n;++j){ //枚举 n 行
if(ch[j][i]=='1') sum++; //如果是‘1’就累加
}
if(sum>max1) max1=sum; //如果大于了之前的最大值,则把 sum 赋给 max1
sum=0; //记住每个循环之后要清 0
}
printf("%d",max1); //输出
}
希望本题解对大家有帮助,也感谢管理员在百忙之中抽空为我审核题解,谢谢!