題目:園藝佈置 java
近期,百度採納了員工們的提議,計劃在總部大樓內部種植園藝,以提供更加舒適的工做環境。公司將園藝設計的任務交給了度度熊同窗。函數
公司總部大樓內部的構造能夠分爲n個區域,編號爲0, 1, …, n–1,其中區域i與i + 1是相鄰的(0 ≤ i < n – 1)。根據員工的投票和反饋,度度熊拿到了一份數據,代表在區域i種植園藝能夠得到員工的滿意度爲Ai。度度熊但願園藝的佈置方案知足條件:spa
1.至少覆蓋m個區域;設計
2.佈置園藝的區域是連續的。code
請幫他找到一種知足條件的方案,使佈置園藝區域的員工的滿意度的平均值最大。rem
輸入描述get
輸入的第一行包含兩個整數n和m,分別表示總區域數和至少覆蓋的區域數。input
第二行包含n個整數A0, A1,…, An – 1,依次表示在每一個區域種植園藝能夠得到員工的滿意度。it
輸出描述io
輸出一行,表示員工的平均滿意度的最大值。若是這個數是一個整數,則直接按整數格式輸出;不然,請用最簡分數表示,分子分母以「/」分割,格式見樣例。
樣例輸入1
3 1
2 3 1
樣例輸入2
5 3
1 8 2 4 8
樣例輸出1
3
樣例輸出2
11/2
提示
樣例2的正確答案爲11/2,儘管22/4數值也相同,但因爲沒有化簡,因此是錯誤的。
對於100%的數據,1 ≤ m ≤ n ≤ 106,1 ≤ Ai ≤ 106。
題目很長吧,弄了快兩天了,幾乎沒考慮時間複雜度的問題,歪歪扭扭的作出了份答案,過程當中回憶起了一些東西:
引用賦值的時候,==會去比較值的地址,equals()比較值 ,例如 Integer a=new Integer(12); Integer b=new Integer(12); 那麼a==b爲false; 使用a.equals(b)爲true
將分數化簡爲最簡分數的時候,分子分母同時除以最大公約數,悲劇 這都忘了
int/int 型結果是int型,即使不能整除,也會輸出整型,不會有小數點代碼附上:
package test; import java.util.ArrayList; import java.util.List; import java.util.Scanner; /** * @author hy * 2011.06.15 */ public class FindBestAverage { static Integer n; static Integer m; static Integer sat[]; public static void main(String args[]) { System.out.print("請依次輸入n和m: "); Scanner inputN = new Scanner(System.in); n = inputN.nextInt(); m = inputN.nextInt(); System.out.print("請依次各個區域的滿意度: "); sat = new Integer[n]; for (int i = 0; i < n; i++) sat[i] = inputN.nextInt(); //找出最大的平均數,此處能夠寫成函數,累了 算了 懶的改 int i, j; int addition = 0; //平均數,整型,小數點後被砍 int average = 0; //餘數 int remnant =0; for (i = 0; i < n; i++) { for (j = m - 1 + i; j < n; j++) if ((additionOf(sat, i, j) / (j - i + 1) > average)) { average = additionOf(sat, i, j) / (j - i + 1); remnant = additionOf(sat, i, j) % (j - i + 1); addition = additionOf(sat, i, j); } else if ((additionOf(sat, i, j) / (j - i + 1) == average) && (additionOf(sat, i, j) / (j - i + 1) > remnant)) { average = additionOf(sat, i, j) / (j - i + 1); remnant = additionOf(sat, i, j) % (j - i + 1); addition = additionOf(sat, i, j); } } //能整除的輸出整數,不能整除的輸出分數形式,還必須是最簡分數 System.out.print("最大評價滿意度爲: "); if (remnant == 0) System.out.println(average); else System.out.println(addition / maxApprox(addition, addition / average) + "/" + (addition / average) / maxApprox(addition, addition / average)); } // 求和 static int additionOf(Integer[] ar, int begin, int end) { int addition = 0; for (int i = begin; i <= end; i++) addition += ar[i]; return addition; } // 求最大公約數 static int maxApprox(int a, int b) { int temp = findYueShu(a).get(0); for (int i = 0; i < findYueShu(a).size(); i++) { int j = 0; for (j = 0; j < findYueShu(b).size(); j++) { if (findYueShu(a).get(i) == findYueShu(b).get(j) && temp < findYueShu(a).get(i)) { temp = findYueShu(a).get(i); } } } return temp; } // 求約數(數字自己出外) static List<Integer> findYueShu(int a) { List<Integer> arr = new ArrayList<Integer>(); for (int i = 1, j = 0; i < a; i++) { if (a % i == 0) { arr.add(j, i); j++; } } return arr; } }
輸出結果:
請依次輸入n和m: 5 3 請依次各個區域的滿意度: 1 8 2 4 8 最大評價滿意度爲: 11/2