小百度給我種樹

題目:園藝佈置 java

近期,百度採納了員工們的提議,計劃在總部大樓內部種植園藝,以提供更加舒適的工做環境。公司將園藝設計的任務交給了度度熊同窗。函數

公司總部大樓內部的構造能夠分爲n個區域,編號爲0, 1, …, n–1,其中區域i與i + 1是相鄰的(0 ≤ i < n – 1)。根據員工的投票和反饋,度度熊拿到了一份數據,代表在區域i種植園藝能夠得到員工的滿意度爲Ai。度度熊但願園藝的佈置方案知足條件:spa

1.至少覆蓋m個區域;設計

2.佈置園藝的區域是連續的。code

請幫他找到一種知足條件的方案,使佈置園藝區域的員工的滿意度的平均值最大。rem

輸入描述get

輸入的第一行包含兩個整數nm,分別表示總區域數和至少覆蓋的區域數。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

 

 

   題目很長吧,弄了快兩天了,幾乎沒考慮時間複雜度的問題,歪歪扭扭的作出了份答案,過程當中回憶起了一些東西:

      float型初始化的時候,強制結尾加上f,否則會報錯,這是爲了和double進行區分,例如:float a=1.5f;  

      引用賦值的時候,==會去比較值的地址,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

相關文章
相關標籤/搜索