一看見這個問題就想起來在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的測試,事實證明程序運行的速度確實快了不少。
謝謝大家閱讀!