两军交锋

Problem Description
话说辽军与MCA相峙多年,终于在一个秋日的早晨爆发了一次大规模的冲突.情况是这样子的,当天上午,由耶律-Pacision领军的辽军忽然带领数万人马浩浩荡荡向MCA山杀来,而这时候驻扎在MCA防守前线的是久经沙场的老将纪哥.纪哥得知这个消息,立刻召集手下精英,前往阻击辽军.现已知辽军前进速度 U 米/秒 ,纪哥 速度 V 米 /秒 ,两军一开始相距L米,战地记者从两军刚开始进军就立刻开始以 W 米/秒的速度马不停蹄地往返于两军之间作第一时间的报道,即一到达一方,立刻返回前往另一方.问,当两军交锋之时,战地记者总共走的路程.
 


Input
首先输入一个t,表示有t组数据,跟着t行:
每行有四个实数 u ,v , w , l 分别表示辽军速度,纪哥速度,记者速度,以及起始的距离.
 


Output
输出一行实数表示总的路程.精确到小数点后3位.
 


Sample Input

1 10 20 30 100
 

 

Sample Output

100.000

 

正确算法:

import java.util.Scanner;

public class Main {
    /**
     * 此题很简单,只需要用(路程/(两军速度相加))求出两军交锋的时间,然后用时间
       乘以记者的速度就可以了。
       
     * 我一开始做这个题目的时候,想得太复杂了,相当于把记者走的过程全部算出来了。
       开始的思路:此题需要细心计算,需要考虑战地记者还没有到达一方军队,他们就已经
       开始交战的情况;还需要考虑如果距离小于多少就可以开始结束死循环。
     */
    public static void main1(String[] args) {
        Scanner input = new Scanner(System.in);
        while (input.hasNext()) {
            int t = input.nextInt();
            while (t-- > 0) {
                double u = input.nextDouble();
                double v = input.nextDouble();
                double w = input.nextDouble();
                double l = input.nextDouble();
                double uv = u + v;
                double vw = v + w;
                double uw = u + w;
                double dis = 0;
//                System.out.println(uv+" "+vw);
                /*
                 * 以辽军为左方,以纪哥为右方,战地记者从左方与纪哥去相遇
                   但是要考虑到当辽军速度比战地记者快时,战地记者还没有碰
                   见纪哥,两军就已经开始交锋了。
                 */
                
                if (u >= w) {
                
                    double time = l / uv;
                    dis = w * time;
                
                } else {
                    boolean mark = true;
                    double time, du, dv;
                    while (l >= 0.001) {

                        if (mark) {
                            time = l / vw;
                            mark = false;
                        } else {
                            time = l / uw;
                            mark = true;
                        }

                        du = u * time;
                        dv = v * time;
                        dis += w * time;
                        l -= du + dv;
                    }

                }
//                System.out.println(dis);
                System.out.printf("%.3f",dis);
                System.out.println();
            }
        }
    } public static void main(String[] args) {

            Scanner input = new Scanner(System.in);
            int t = input.nextInt();
            for (int total = 0; total < t; total++) {
                double u = input.nextDouble();
                double v = input.nextDouble();
                double w = input.nextDouble();
                double l = input.nextDouble();
               double juli=l/(u+v)*w;
                System.out.printf("%.3f", juli);
                System.out.println("");
            }

        }
    
}



原文地址:https://www.cnblogs.com/syjp/p/10360526.html