题目:园艺布置 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
将分数化简为最简分数的时候,分子分母同时除以最大公约数,悲剧 这都忘了
代码附上:
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