你好呀,我是灰小猿,一個超會寫bug的程式猿!
歡迎大家關注我的專欄“每日藍橋”,該專欄的主要作用是和大家分享近幾年藍橋杯省賽及決賽等真題,決議其中存在的演算法思想、資料結構等內容,幫助大家學習到更多的知識和技術!
標題:分糖果
有n個小朋友圍坐成一圈,老師給每個小朋友隨機發偶數個糖果,然后進行下面的游戲:
每個小朋友都把自己的糖果的一半給左手邊的孩子,
一輪分糖后,擁有奇數顆糖果的孩子由老師補給1個糖果,從而變成偶數,
反復進行這個游戲,直到所有的小朋友的糖果數都相同為止,
你的任務就是預測在已知的初始糖果情形下,老師一共需要補發多少個糖果,
【格式要求】
程式首先讀入一個整數N(2<N<100),表示小朋友的人數,
借著是一行用空格分開的N個偶數(每個偶數不大于1000,不小于2)
要求程式輸出一個整數,表示老師需要補發的糖果數,
例如:輸入
3
2 2 4
程式應該輸出:
4
資源約定:
峰值記憶體消耗(含虛擬機)< 256M
CPU消耗 < 1000ms
請嚴格按要求輸出,不要畫蛇添足的列印類似“請您輸入...”的多余內容,
所有代碼放在同一個源檔案中,除錯通過后,拷貝提交該原始碼,
注意:不要使用package陳述句,不要使用jdk1.6及以上的版本特性
注意:主類的名稱必須是Main 否則按無效代碼處理,
解題思路:
在這一道題中的思路還是比較明確的,我們可以將每一個小朋友擁有的糖果數量存放在陣列中,然后可以使用while回圈或者遞回來進行每一輪的游戲,在每一輪游戲結束后,判斷陣列中的元素個數是否相等,
接下來采用while回圈和遞回來分別求解這道題:
答案原始碼:
while回圈法
package 一四年省賽真題; import java.util.Scanner; public class Year2014_Bt8_2 { public static void main(String[] args) { Scanner scanner = new Scanner(System.in); int N = scanner.nextInt(); int[] arr = new int[N]; for (int i = 0; i < arr.length; i++) { arr[i] = scanner.nextInt(); } int ans = 0; while (true) { int firstN = arr[0]; for (int i = 0; i < arr.length; i++) { if (i==arr.length-1) { arr[i] = arr[i]/2 + firstN/2; } else { arr[i] = arr[i]/2 + arr[i+1]/2; } } //老師補發糖果 for (int i = 0; i < arr.length; i++) { //如果當前手中的糖果數量是奇數個 if (arr[i]%2!=0) { arr[i]+=1; ans++; } } //判斷陣列中的元素是否都相等 if (check(arr)) { System.out.println(ans); } } } //判斷陣列元素值是否都相等 private static boolean check(int[] arr) { for (int i = 0; i < arr.length; i++) { if (arr[i]!=arr[0]) { return false; } } return true; } } }遞回法
package 一四年省賽真題; import java.util.Scanner; public class Year2014_Bt8 { static int ans = 0; //記錄補發的糖果數 public static void main(String[] args) { Scanner scanner = new Scanner(System.in); int N = scanner.nextInt(); int[] arr = new int[N]; for (int i = 0; i < arr.length; i++) { arr[i] = scanner.nextInt(); } f(arr); System.out.println(ans); } //每一輪游戲 private static void f(int[] arr) { int firstN = arr[0]; //記錄第一個陣列元素 //利用回圈將每一個小朋友手中的糖果給左邊的小朋友分一半 for (int i = 0; i < arr.length; i++) { if (i==arr.length-1) { arr[i] = arr[i]/2 + firstN/2; }else { arr[i] = arr[i]/2 + arr[i+1]/2; } } //老師補發糖果 for (int i = 0; i < arr.length; i++) { //如果當前手中的糖果數量是奇數個 if (arr[i]%2!=0) { arr[i]+=1; ans+=1; } } //判斷陣列中的元素是否都相等 if (check(arr)) { return; } //進行下一輪游戲 f(arr); } //判斷陣列元素值是否都相等 private static boolean check(int[] arr) { for (int i = 0; i < arr.length; i++) { if (arr[i]!=arr[0]) { return false; } } return true; } }
輸出樣例:
其中有不足或者改進的地方,還希望小伙伴留言提出,一起學習!
感興趣的小伙伴可以關注專欄!
灰小猿陪你一起進步!

轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/257441.html
標籤:java

