小百度给我种树

题目:园艺布置 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

相关文章
相关标签/搜索