题目
前言
经查阅网络上的,答案很多分析都不到位,代码复杂不说,而且逻辑混乱,随便测试几种情况答案就不符合。
故写下这篇文章来解决问题
问题分析:
列分析
读题可知,不管你有多少列,每出现5个就要空一列
那么这个条件如何转化为代码语言呢?
思考一会儿,我们选择枚举+数学归纳即可
列 | 每行储物柜的个数 |
---|---|
1 | 1 |
2 | 2 |
3 | 3 |
4 | 4 |
5 | 5 |
6 | 5 |
7 | 6 |
不难发现,当出现6的时候储物柜空了出来,也就是说每有6列就要少一列
储物柜数量=列数-列数/6
行分析
仍然采用枚举加归纳
归纳一下,可以知道,每3个就会有两个增量,那么我们除以3就可以得到,有多少个 2行,再做一个对3的取余,根据余数判断是不是还有遗漏的没有加上的可用行数
3有 0 ,1,2三个余数,0,1由表格可知没有可用行数,2有一行。
综上所述:
if(n%3==2)
temp=1;//这个变量一开始初始化成0,只有余数为2的时候才赋值成1
使用一个简单的判断就可以达到效果
n=n/3*2+temp;//这便是可用行数
先将所有行数除以3再乘以2,得到所有成对的组,切记,n要初始化成int,那么使用 除法的时候商的结果就是只有整数部分
n<3是,直接是0
分析完毕,完整代码如下:
/*!
* 代码风格:c语言程序设计--现代方法
*/
#include <iostream>
using namespace std;
int n , m , ans , temp = 0;//蓝桥杯主函数分配的内存小,变量最好定义成全局变量
int main()
{
cin >> n >> m;
if( n%3 == 2 )
temp = 1;
ans = ( n / 3 * 2 + temp ) * ( m - m / 6 );
cout << ans << endl;
return 0;
}