浏览 2606 次
精华帖 (0) :: 良好帖 (0) :: 新手帖 (18) :: 隐藏帖 (1)
|
|
---|---|
作者 | 正文 |
发表时间:2010-06-07
17. 字符统计问题。 18. 最优服务次序问题。 平均等待时间是n个顾客等待服务时间的总和除以n。 例如: output:
19. 多处最优服务次序问题。 例如: output: 20. 最优分解问题。 声明:ITeye文章版权属于作者,受法律保护。没有作者书面许可不得转载。
推荐链接
|
|
返回顶楼 | |
发表时间:2010-06-08
最后修改:2010-06-08
20. 最优分解问题。
package boke.written; /** * 20. 最优分解问题。 设n是一个正整数。现在要求将n分解为若干互不相同的自然数之和,且使这些自然数的乘积最大。 * 贪心算法 * @since jdk1.5及其以上 * @author 毛正吉 * @version 1.0 * @date 2010.06.07 * */ public class DicompNumber { /** * @param args */ public static void main(String[] args) { int n = 10; dicomp(n); } public static void dicomp(int n) { int sum = 1; int sun = 0; int[] a = new int[n + 1]; int k = 1; if (n < 3) { a[1] = 0; return; } if (n < 5) { a[k] = 1; a[++k] = n - 1; return; } a[1] = 2; n -= 2; while (n > a[k]) { k++; a[k] = a[k - 1] + 1; n -= a[k]; } if (n == a[k]) { a[k]++; n--; } for (int i = 0; i < n; i++) { a[k - i]++; } // StringBuffer s = new StringBuffer(); StringBuffer b = new StringBuffer(); for (int i = 1; i < a.length; i++) { if (a[i] != 0) { sun += a[i]; sum *= a[i]; s.append(a[i] + " * "); b.append(a[i] + " + "); } } String ss = s.substring(0, s.length() - 3); String bb = b.substring(0, b.length() - 3); ss += " = "; bb += " = "; ss += sum + ""; bb += sun + ""; System.out.println(bb); System.out.println(ss); } } 输出: 2 + 3 + 5 = 10 2 * 3 * 5 = 30 |
|
返回顶楼 | |
发表时间:2010-06-09
17. 字符统计问题。
package abstractandlogic; import java.util.HashMap; import java.util.Map; /** * 17. 字符统计问题。 编写一个算法,统计在一个输入字符串中各个不同字符出现的频度。 * * @sincejdk1.6 * @author 毛正吉 * @version 1.0 * @date 2010.06.08 * */ public class CharacterFrequency { /** * @param args */ public static void main(String[] args) { characterFrequency("ab"); } /** * 统计不同字符出现的频度 * * @param s */ public static void characterFrequency(String s) { Map<Character, Integer> charMap = new HashMap<Character, Integer>(); if (s != null && !"".equals(s)) { char[] ch = s.toCharArray(); int len = ch.length; for (char c : ch) { if (charMap.containsKey(c)) { int i = charMap.get(c); i++; charMap.put(c, i); } else { charMap.put(c, 1); } } for (Map.Entry<Character, Integer> entry : charMap.entrySet()) { char c = entry.getKey(); int i = entry.getValue(); System.out.println(c + " : " + i); } } } } |
|
返回顶楼 | |
发表时间:2010-06-10
18.最优服务次序问题。
package abstractandlogic; import java.util.Arrays; /** * 18.最优服务次序问题。 设有n个顾客同时等待一项服务。顾客i需要的服务时间为ti, 1<=i<=n。应如何安排n个顾客的服务次序才能使平均等待时间达到最小? * 平均等待时间是n个顾客等待服务时间的总和除以n。 input: 正整数n,表示n个顾客。 接下来一行输入n个正整数,表示n个顾客需要的服务时间。 * output:最小的平均等待时间 * * @since jdk1.6 * @author 毛正吉 * @version 1.0 * @date 2010.06.08 * */ public class BestService { /** * @param args */ public static void main(String[] args) { int n = 10; int[] a = { 56, 12, 1, 99, 1000, 234, 33, 55, 99, 812 }; double sum = bestService(a, n); System.out.println(sum); } /** * 计算最小的平均等待时间 * * @param a * @param n * @return */ public static double bestService(int[] a, int n) { double sum = 0.0; Arrays.sort(a); // 贪心策略:最短服务时间优先 for (int i = 1; i < n; i++) { a[i] += a[i - 1]; } for (int i = 0; i < n; i++) { sum += a[i]; } sum /= n; // 最小的平均等待时间 return sum; } } |
|
返回顶楼 | |
发表时间:2010-06-10
19. 多处最优服务次序问题。 package abstractandlogic; import java.util.Arrays; /** * 19. 多处最优服务次序问题。 设有n个顾客同时等待一项服务。顾客i需要的服务时间为ti, 1<=i<=n。共有s处可以提供此项服务。应如何安排n个顾客的服务次序才能使 * 平均等待时间达到最小?平均等待时间是n个顾客等待服务时间的总和除以n。 输入:2个正整数n和s,表示有n个顾客且有s处可以提供顾客需要的服务。 * 接下来一行中有n个正整数,表式n个顾客需要的服务时间。 输出:最小的平均等待时间 * * @since jdk1.6 * @author 毛正吉 * @version 1.0 * @date 2010.06.08 * */ public class ManyBestService { /** * @param args */ public static void main(String[] args) { int n = 10; int s = 2; int[] a = { 56, 12, 1, 99, 1000, 234, 33, 55, 99, 812 }; double sum = manyBestService(n, s, a); System.out.println(sum); } /** * 求最小的平均等待时间 * @param n * @param s * @param a * @return */ public static double manyBestService(int n, int s, int[] a) { double sum = 0.0; int[] a1 = new int[s]; int[] a2 = new int[s]; Arrays.sort(a); // 贪心策略:最短服务时间优先 int i = 0; int j = 0; while (i < n) { a1[j] += a[i]; // s1处服务时间累加 a2[j] += a1[j]; // 总的服务时间累加 i++; j++; if (j == s) { j = 0; } } for (i = 0; i < s; i++) { sum += a2[i]; } sum /= n; // 最小的平均等待时间 return sum; } } |
|
返回顶楼 | |
发表时间:2010-06-10
各位Je朋友, 第19题是相当经典的一道题目,如果你有兴趣,可以好好模拟一下。。。
|
|
返回顶楼 | |
发表时间:2010-06-10
19. 多处最优服务次序问题。 另外一种解法
package abstractandlogic; import java.util.Arrays; /** * 19. 多处最优服务次序问题。 设有n个顾客同时等待一项服务。顾客i需要的服务时间为ti, 1<=i<=n。共有s处可以提供此项服务。应如何安排n个顾客的服务次序才能使 * 平均等待时间达到最小?平均等待时间是n个顾客等待服务时间的总和除以n。 输入:2个正整数n和s,表示有n个顾客且有s处可以提供顾客需要的服务。 * 接下来一行中有n个正整数,表式n个顾客需要的服务时间。 输出:最小的平均等待时间 * * @since jdk1.6 * @author 毛正吉 * @version 1.0 * @date 2010.06.08 * */ public class ManyBestService { /** * @param args */ public static void main(String[] args) { int n = 10; int s = 2; int[] a = { 56, 12, 1, 99, 1000, 234, 33, 55, 99, 812 }; double sum = manyBestService(n, s, a); System.out.println(sum); } /** * 求最小的平均等待时间 * * @param n * @param s * @param a * @return */ public static double manyBestService(int n, int s, int[] a) { double sum = 0.0; int[] a1 = new int[s]; int[] a2 = new int[n]; Arrays.sort(a); // 贪心策略:最短服务时间优先 int i = 0; int j = 0; while (i < n) { a1[j] += a[i]; // s1处服务时间累加 a2[i] = a1[j]; // 每个服务员的等待时间 i++; j++; if (j == s) { j = 0; } } for (i = 0; i < n; i++) { sum += a2[i]; } sum /= n; // 最小的平均等待时间 return sum; } } |
|
返回顶楼 | |
发表时间:2010-07-29
maozj 写道 20. 最优分解问题。
package boke.written; /** * 20. 最优分解问题。 设n是一个正整数。现在要求将n分解为若干互不相同的自然数之和,且使这些自然数的乘积最大。 * 贪心算法 * @since jdk1.5及其以上 * @author 毛正吉 * @version 1.0 * @date 2010.06.07 * */ public class DicompNumber { /** * @param args */ public static void main(String[] args) { int n = 10; dicomp(n); } public static void dicomp(int n) { int sum = 1; int sun = 0; int[] a = new int[n + 1]; int k = 1; if (n < 3) { a[1] = 0; return; } if (n < 5) { a[k] = 1; a[++k] = n - 1; return; } a[1] = 2; n -= 2; while (n > a[k]) { k++; a[k] = a[k - 1] + 1; n -= a[k]; } if (n == a[k]) { a[k]++; n--; } for (int i = 0; i < n; i++) { a[k - i]++; } // StringBuffer s = new StringBuffer(); StringBuffer b = new StringBuffer(); for (int i = 1; i < a.length; i++) { if (a[i] != 0) { sun += a[i]; sum *= a[i]; s.append(a[i] + " * "); b.append(a[i] + " + "); } } String ss = s.substring(0, s.length() - 3); String bb = b.substring(0, b.length() - 3); ss += " = "; bb += " = "; ss += sum + ""; bb += sun + ""; System.out.println(bb); System.out.println(ss); } } 输出: 2 + 3 + 5 = 10 2 * 3 * 5 = 30 10 = 2 + 2 + 2 + 2 + 2 2 * 2 * 2 * 2 * 2 = 32 > 30 ??? |
|
返回顶楼 | |
发表时间:2010-07-30
jellyfish 写道 maozj 写道 20. 最优分解问题。
package boke.written; /** * 20. 最优分解问题。 设n是一个正整数。现在要求将n分解为若干互不相同的自然数之和,且使这些自然数的乘积最大。 * 贪心算法 * @since jdk1.5及其以上 * @author 毛正吉 * @version 1.0 * @date 2010.06.07 * */ public class DicompNumber { /** * @param args */ public static void main(String[] args) { int n = 10; dicomp(n); } public static void dicomp(int n) { int sum = 1; int sun = 0; int[] a = new int[n + 1]; int k = 1; if (n < 3) { a[1] = 0; return; } if (n < 5) { a[k] = 1; a[++k] = n - 1; return; } a[1] = 2; n -= 2; while (n > a[k]) { k++; a[k] = a[k - 1] + 1; n -= a[k]; } if (n == a[k]) { a[k]++; n--; } for (int i = 0; i < n; i++) { a[k - i]++; } // StringBuffer s = new StringBuffer(); StringBuffer b = new StringBuffer(); for (int i = 1; i < a.length; i++) { if (a[i] != 0) { sun += a[i]; sum *= a[i]; s.append(a[i] + " * "); b.append(a[i] + " + "); } } String ss = s.substring(0, s.length() - 3); String bb = b.substring(0, b.length() - 3); ss += " = "; bb += " = "; ss += sum + ""; bb += sun + ""; System.out.println(bb); System.out.println(ss); } } 输出: 2 + 3 + 5 = 10 2 * 3 * 5 = 30 10 = 2 + 2 + 2 + 2 + 2 2 * 2 * 2 * 2 * 2 = 32 > 30 ??? 最优分解问题。 设n是一个正整数。现在要求将n分解为若干互不相同的自然数之和,且使这些自然数的乘积最大。 注意:将n分解为若干互不相同的自然数之和. |
|
返回顶楼 | |