一看见这个问题就想起来在2840里面做过一题类似的题目——换硬币。但明显感觉到这题有几个特殊的地方,首先他题目要求人数和砖数要一致也就是说三类人能搬这么多砖是不够的,其次我们要把所有情况列举出来,下面来看我的解题
#include<stdio.h> int main() { int child,men,wom,n,a=0; scanf("%d",&n); for(men=0;men<=n;men++) for(wom=0;wom<=n;wom++) for(child=0;child<=n;child++) if(men+child+wom==n&&men*3+wom*2+child*0.5==n){ printf("men = %d, women = %d, child = %d\n",men,wom,child); break; } return 0; }
我利用三段循环把男人,女人和小孩的人数进行递增,然后在循环的最内部加是判断得出答案。
结果发现N<3的情况错误,再去审题发现一个细节就是如果没有符合条件的方案则输出‘None’。于是我利用一个判断标志flag来完成这一步骤。这是我们在编程中常用的方法在代码中加上一个flag通过是否进行来改变flag的值来进行判断是否进行一个后续步骤。
#include<stdio.h> int main() { int child, men, wom, n, a = 0; scanf("%d", &n); for (men = 0; men <= n; men++) for (wom = 0; wom <= n; wom++) for (child = 0; child <= n; child++) if (men + child + wom == n && men * 3 + wom * 2 + child * 0.5 == n) { printf("men = %d, women = %d, child = %d\n", men, wom, child); a++; break; } if (a == 0) { printf("None"); } return 0; }
这里我是用a来代替flag,结果正确了。一般到这来我们的代码就结束了,但我们要学着精简代码让程序运行
尽量快,这样的代码才是个合格的代码。
简化代码
在这题中男人一次可以搬三块转,但是题目的限制条件是人数等于转数也就是说男人的人数要远远小于n,具体要少多少我进行了一个简单的计算:男人如果为1则要满足人数等于砖数则男人最多只能是总人数的1/5,所以最外层的n可以改成n/5。以此类推我写出了下面的代码。
#include<stdio.h> int main() { int child,men,wom,n,a=0; scanf("%d",&n); for(men=0;men<=n/5;men++) for(wom=0;wom<=n/3;wom++) for(child=0;child<=n*4/5;child++) if(men+child+wom==n&&men*3+wom*2+child*0.5==n){ printf("men = %d, women = %d, child = %d\n",men,wom,child); a++; break; } if(a==0){ printf("None"); } return 0; }
这样修改代码后对小数据的处理变慢了,而且内存也变大了。但是大家别忘了我们不可能总是处理这么小的数据,我后来对这题进行比较大的的n的测试,事实证明程序运行的速度确实快了不少。
谢谢大家阅读!