JAVA代码—算法基础:蚂蚁爬行问题
2018-02-24 12:53
633 查看
[b]蚂蚁爬行问题[/b]
题目描述如下:
1、有一根100厘米的细木杆,在第15厘米、20厘米、25厘米、38厘米、42厘米、50厘米这六个位置上各有一只蚂蚁。
2、木杆很细,不能同时通过两只蚂蚁。
3、开始时,蚂蚁的头朝左还是朝右是任意的,它们只会朝前走或调头,但不会后退。
4、当任意两只蚂蚁碰头时,两只蚂蚁会同时调头朝反方向走。
5、假设蚂蚁们每秒钟可以走一厘米的距离。
编写程序,求所有蚂蚁都离开木杆 的最小时间和最大时间。
解题思路:
初次看到这道题,一定会觉得非常复杂。但是仔细想想看,两只蚂蚁相撞,它们会同时掉头朝反向走。例如A和B相遇(相撞),现在A掉头反向走,B也掉头反向走。假设现在把A看作是B,而B看做是A,其实他们的速度都是相同的,相当于把他们做一个交换也无妨。这也就相当于和A与B其实是没有关系的。
关于最短时间:
位于细木杆中间的那只蚂蚁到达某一端的最小时间。
关于最长时间:
所以最长的时间为左端的蚂蚁到右端的时间和右端的蚂蚁到左端的时间两者中的最大值。
所以本题给出的数据分析结果为:最短时间为:50;最长时间为:85
算法设计:
[b]算法设计(2)完整代码[/b]
输入文件内容:
2
6 100
25 20 50 38 42 15
3 10
2 6 7
输出结果:
50 85
4 8
Spent Time: 37
(完)
题目描述如下:
1、有一根100厘米的细木杆,在第15厘米、20厘米、25厘米、38厘米、42厘米、50厘米这六个位置上各有一只蚂蚁。
2、木杆很细,不能同时通过两只蚂蚁。
3、开始时,蚂蚁的头朝左还是朝右是任意的,它们只会朝前走或调头,但不会后退。
4、当任意两只蚂蚁碰头时,两只蚂蚁会同时调头朝反方向走。
5、假设蚂蚁们每秒钟可以走一厘米的距离。
编写程序,求所有蚂蚁都离开木杆 的最小时间和最大时间。
解题思路:
初次看到这道题,一定会觉得非常复杂。但是仔细想想看,两只蚂蚁相撞,它们会同时掉头朝反向走。例如A和B相遇(相撞),现在A掉头反向走,B也掉头反向走。假设现在把A看作是B,而B看做是A,其实他们的速度都是相同的,相当于把他们做一个交换也无妨。这也就相当于和A与B其实是没有关系的。
关于最短时间:
位于细木杆中间的那只蚂蚁到达某一端的最小时间。
关于最长时间:
所以最长的时间为左端的蚂蚁到右端的时间和右端的蚂蚁到左端的时间两者中的最大值。
所以本题给出的数据分析结果为:最短时间为:50;最长时间为:85
算法设计:
//输入参数l为细木杆的长度;x[]数组为蚂蚁的位置 public static void solve(int l, int x[]) { if (0 >= x.length) return; int min, max; min = max = 0; int d1, d2; for (int i = 0; i < x.length; i++) { if (x[i] <= l - x[i]) { d1 = x[i]; d2 = l - x[i]; } else { d1 = l - x[i]; d2 = x[i]; } if (min < d1) { min = d1; } if (max < d2) { max = d2; } } System.out.println(min + " " + max); }
[b]算法设计(2)完整代码[/b]
package com.bean.basic; import java.io.FileInputStream; import java.io.FileNotFoundException; import java.util.Scanner; public class AntsCrawlingProblem { /* * 蚂蚁爬行问题的描述: * n 只蚂蚁以每秒1cm的速度在长为Lcm的竹竿上爬行。当蚂蚁看到竿子的端点时就会落下来。 * 由于竿子太细,两只蚂蚁相遇时,它们不能交错通过,只能各自反方向爬行。 * 对于每只蚂蚁,我们只知道它离竿子最左端的距离为xi,但不知道它当前的朝向。 * 请计算所有蚂蚁落下竿子的最短时间和最长时间。 * * 限制条件: * 1<=L<=10的6次方 * 1<=n<=10的6次方 * 0<=xi<=L * * 样例: * 输入 * L=10 * n=3 * x={2,6,7} * * 输出 * min=4 {左、右、右} * max=8 {右、右、右} * * 样例输入 * 6 100 * 25 20 50 38 42 15 * The minimum time is: 50 * The maximum time is: 85 * */ public static void main(String[] args) throws FileNotFoundException { long start = System.currentTimeMillis(); System.setIn(new FileInputStream("D:\\SamplData\\Ants_input.txt")); Scanner sc = new Scanner(System.in); while (sc.hasNext()) { //测试用例数量 int T = sc.nextInt(); for(int t=0; t<T; t++){ int ant = sc.nextInt();//蚂蚁数目 int len = sc.nextInt();//水平长度 //构造蚂蚁数量的数组,用来存储每个蚂蚁的位置 int[] ants = new int[ant];//每只蚂蚁距离 //计算细木棍的中点位置 int lens = len / 2;//水平中点长度 //顺序读取每个蚂蚁所在的位置 for(int i=0; i<ant; i++){ int dis = sc.nextInt(); if(lens >= dis){ ants[i] = dis; }else { ants[i] = len - dis;//全长-远距离=近距离 } } int max = 0; int min = lens; for(int i=0; i<ant; i++){ max = Math.max(max, ants[i]);//要所有蚂蚁都掉下来,则最早时间是位于中点位置处的蚂蚁到达端点的时间 min = Math.min(min, ants[i]);//最晚掉下来的蚂蚁是距离一个端点最近的相反方向的端点。 } System.out.println(max + " " + (len-min)); } } long end = System.currentTimeMillis(); System.out.println("Spent Time: " + (end - start)); } }
输入文件内容:
2
6 100
25 20 50 38 42 15
3 10
2 6 7
输出结果:
50 85
4 8
Spent Time: 37
(完)
相关文章推荐
- JAVA代码—算法基础:子数组的最大累加和问题
- JAVA代码—算法基础:数塔问题(动态规划)
- JAVA代码—算法基础:活动安排问题(贪心算法)
- JAVA代码—算法基础:整数拆分求最大乘积问题
- JAVA代码—算法基础:最少货币换钱问题求解(动态规划)
- JAVA代码—算法基础:四平方定理问题
- JAVA代码—算法基础:学生出勤记录问题
- JAVA代码—算法基础:因子组合问题
- JAVA代码—算法基础:切割钢锯条售卖的问题
- JAVA代码—算法基础:背包问题(基础版本:0-1背包)
- JAVA代码—算法基础:最大数问题
- JAVA代码—算法基础:最大连续子数组乘积问题
- JAVA代码—算法基础:反转整数问题
- JAVA代码—算法基础:马走8×8棋盘问题
- JAVA代码—算法基础:三角形最短路径问题
- JAVA代码—算法基础:素数环问题
- JAVA代码—算法基础:0-1背包问题的回溯算法设计(续)
- JAVA代码—算法基础:0-1矩阵的问题
- JAVA代码—算法基础:航线问题
- JAVA代码—算法基础:求两个字符串的最长公共子序列问题