本文共 2455 字,大约阅读时间需要 8 分钟。
题目描述如下:
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); }
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= dis){ ants[i] = dis; }else { ants[i] = len - dis;//全长-远距离=近距离 } } int max = 0; int min = lens; for(int i=0; i
输入文件内容:
2 6 100 25 20 50 38 42 15 3 10 2 6 7输出结果:
50 85
4 8 Spent Time: 37(完)
转载地址:http://ugvdi.baihongyu.com/