Problem Description
话说辽军与MCA相峙多年,终于在一个秋日的早晨爆发了一次大规模的冲突.情况是这样子的,当天上午,由耶律-Pacision领军的辽军忽然带领数万人马浩浩荡荡向MCA山杀来,而这时候驻扎在MCA防守前线的是久经沙场的老将纪哥.纪哥得知这个消息,立刻召集手下精英,前往阻击辽军.现已知辽军前进速度 U 米/秒 ,纪哥 速度 V 米 /秒 ,两军一开始相距L米,战地记者从两军刚开始进军就立刻开始以 W 米/秒的速度马不停蹄地往返于两军之间作第一时间的报道,即一到达一方,立刻返回前往另一方.问,当两军交锋之时,战地记者总共走的路程.
Input
首先输入一个t,表示有t组数据,跟着t行:
每行有四个实数 u ,v , w , l 分别表示辽军速度,纪哥速度,记者速度,以及起始的距离.
每行有四个实数 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("");
}
}
}