java算法题——龟兔赛跑
问题描述话说这个世界上有各种各样的兔子和乌龟,但是研究发现,所有的兔子和乌龟都有一个共同的特点——喜欢赛跑。于是世界上各个角落都不断在发生着乌龟和兔子的比赛,小华对此很感...
问题描述
话说这个世界上有各种各样的兔子和乌龟,但是研究发现,所有的兔子和乌龟都有一个共同的特点——喜欢赛跑。于是世界上各个角落都不断在发生着乌龟和兔子的比赛,小华对此很感兴趣,于是决定研究不同兔子和乌龟的赛跑。他发现,兔子虽然跑比乌龟快,但它们有众所周知的毛病——骄傲且懒惰,于是在与乌龟的比赛中,一旦任一秒结束后兔子发现自己领先t米或以上,它们就会停下来休息s秒。对于不同的兔子,t,s的数值是不同的,但是所有的乌龟却是一致——它们不到终点决不停止。
然而有些比赛相当漫长,全程观看会耗费大量时间,而小华发现只要在每场比赛开始后记录下兔子和乌龟的数据——兔子的速度v1(表示每秒兔子能跑v1米),乌龟的速度v2,以及兔子对应的t,s值,以及赛道的长度l——就能预测出比赛的结果。但是小华很懒,不想通过手工计算推测出比赛的结果,于是他找到了你——清华大学计算机系的高才生——请求帮助,请你写一个程序,对于输入的一场比赛的数据v1,v2,t,s,l,预测该场比赛的结果。
输入格式
输入只有一行,包含用空格隔开的五个正整数v1,v2,t,s,l,其中(v1,v2<=100;t<=300;s<=10;l<=10000且为v1,v2的公倍数)
输出格式
输出包含两行,第一行输出比赛结果——一个大写字母“T”或“R”或“D”,分别表示乌龟获胜,兔子获胜,或者两者同时到达终点。
第二行输出一个正整数,表示获胜者(或者双方同时)到达终点所耗费的时间(秒数)。
样例输入
10 5 5 2 20
样例输出
D
4
样例输入
10 5 5 1 20
样例输出
R
3
样例输入
10 5 5 3 20
样例输出
T
4
里面有个一测评点的数据是这样的
输入:
25 10 20 3 100
输出:
R
7
我就不明白我自己用手算的好像不是这个结果哇
我自己算的是
T
10
求解答。。。 展开
话说这个世界上有各种各样的兔子和乌龟,但是研究发现,所有的兔子和乌龟都有一个共同的特点——喜欢赛跑。于是世界上各个角落都不断在发生着乌龟和兔子的比赛,小华对此很感兴趣,于是决定研究不同兔子和乌龟的赛跑。他发现,兔子虽然跑比乌龟快,但它们有众所周知的毛病——骄傲且懒惰,于是在与乌龟的比赛中,一旦任一秒结束后兔子发现自己领先t米或以上,它们就会停下来休息s秒。对于不同的兔子,t,s的数值是不同的,但是所有的乌龟却是一致——它们不到终点决不停止。
然而有些比赛相当漫长,全程观看会耗费大量时间,而小华发现只要在每场比赛开始后记录下兔子和乌龟的数据——兔子的速度v1(表示每秒兔子能跑v1米),乌龟的速度v2,以及兔子对应的t,s值,以及赛道的长度l——就能预测出比赛的结果。但是小华很懒,不想通过手工计算推测出比赛的结果,于是他找到了你——清华大学计算机系的高才生——请求帮助,请你写一个程序,对于输入的一场比赛的数据v1,v2,t,s,l,预测该场比赛的结果。
输入格式
输入只有一行,包含用空格隔开的五个正整数v1,v2,t,s,l,其中(v1,v2<=100;t<=300;s<=10;l<=10000且为v1,v2的公倍数)
输出格式
输出包含两行,第一行输出比赛结果——一个大写字母“T”或“R”或“D”,分别表示乌龟获胜,兔子获胜,或者两者同时到达终点。
第二行输出一个正整数,表示获胜者(或者双方同时)到达终点所耗费的时间(秒数)。
样例输入
10 5 5 2 20
样例输出
D
4
样例输入
10 5 5 1 20
样例输出
R
3
样例输入
10 5 5 3 20
样例输出
T
4
里面有个一测评点的数据是这样的
输入:
25 10 20 3 100
输出:
R
7
我就不明白我自己用手算的好像不是这个结果哇
我自己算的是
T
10
求解答。。。 展开
2个回答
展开全部
package p1;
import java.util.Scanner;
/**
* 龟兔赛跑
*
* @author yugi
*/
public class TortoiseHare
{
public static final String T = "T";
public static final String R = "R";
public static final String D = "D";
private static void race ( int v1, int v2, int t, int s, int l,
int start1, int start2, int s1, int s2, int time,
boolean rest )
{
if (
v1 < 0 || v2 < 0 || t < 0 || s < 0 || l < 0
|| v1 > 100 || v2 > 100 || t > 300 || s > 10 || l > 10000
|| l % v1 != 0 || l % v2 != 0
)
{
try
{
throw new Exception ("参数输入不合标准 !");
}
catch (Exception e)
{}
}
else
{
// 兔子或乌龟已经到达终点
if (s1 >= l || s2 >= l)
{
if (s1 > s2)
{
System.out.println (R);
System.out.println (time + start1);
}
else if (s1 < s2)
{
System.out.println (T);
System.out.println (start2);
}
else
{
System.out.println (D);
System.out.println (start2);
}
return;
}
// 兔子开始休息
if (!rest && s1 - s2 >= t)
{
rest = true;
time += s;
}
// 兔子休息了s秒 (不包括s秒, 第s秒开始行动, 题目意思不是s秒之后)
if (rest && start2 - start1 >= s)
{
// 开始跑了 (不休息)
rest = false;
}
// 兔子不休息的时候跑
if (!rest)
{
start1++;
s1 = v1 * start1;
}
// 乌龟总在跑
start2++;
s2 = v2 * start2;
// 递归调用
race (v1, v2, t, s, l, start1, start2, s1, s2, time, rest);
}
}
public static void main ( String[] args )
{
System.out.println ("输入只有一行,包含用空格隔开的五个正整数v1,v2,t,s,l," +
"\n其中(v1,v2<=100;t<=300;s<=10;l<=10000且为v1,v2的公倍数)" +
"\n退出输入n/N, 否则继续: ");
Scanner scanner = new Scanner (System.in);
String line = null;
String reg = "^([1-9]\\d*|\\d)\\s+([1-9]\\d*|\\d)\\s+([1-9]\\d*|\\d)\\s+([1-9]\\d*|\\d)\\s+([1-9]\\d*|\\d)$";
while (scanner.hasNextLine ())
{
line = scanner.nextLine ().trim ();
if ("n".equalsIgnoreCase (line))
{
break;
}
if (!line.matches (reg))
{
System.err.println ("输入不对, 重新输入: ");
}
else
{
String[] input = line.split ("\\s+");
int v1 = Integer.parseInt (input[0]);
int v2 = Integer.parseInt (input[1]);
int t = Integer.parseInt (input[2]);
int s = Integer.parseInt (input[3]);
int l = Integer.parseInt (input[4]);
race (v1, v2, t, s, l, 0, 0, 0, 0, 0, false);
System.out.println ("退出输入n/N, 否则继续: ");
}
}
scanner.close ();
}
}
追问
兔子休息了s秒 (不包括s秒, 第s秒开始行动, 题目意思不是s秒之后)
这个有点不明白~
可以写出来每一秒兔子和乌龟已经走的路程吗
只用写25 10 20 3 100这个测试数据的
就是像这样:
兔:25 50 50 50 75 75 75 95 115
龟:10 20 30 40 50 60 70 80 90
这样的~
谢谢你了
追答
自己到里面加打印语句,s1,s2分别是2个的每秒路程
本回答被网友采纳
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
public class Test1{
public static void main(String[] args) throws InterruptedException {
int v1=25,v2=10,t=20,s=3,l=100;
Scanner scanner=new Scanner(System.in);
v1=scanner.nextInt();
v2=scanner.nextInt();
t=scanner.nextInt();
s=scanner.nextInt();
l=scanner.nextInt();
int sum1=0,sum2=0;
boolean stop=false;
int stopcount=0;
int i=0;
for ( i = 0; i < l/v2; i++) {
if(sum1>=l||sum2>=l)//如果有一个跑到了终点就结束了
break;
if(stopcount==s)
stop=false; //如果休息的时间够了,就开始跑
if(sum1-sum2>=t)
stop=true; //如果超过了t米,就休息
if(!stop)
sum1+=v1; //当兔子不休息的时候跑
else
stopcount++; //休息的时间计数
sum2+=v2;//乌龟每次都会跑
System.out.print("兔子跑了:"+sum1+"米");
System.out.println("乌龟跑了:"+sum2+"米");
}
if(sum1==sum2)
System.out.println("D"+i);
else if(sum1>=l)
System.out.println("R"+i);
else if(sum2>=l)
System.out.println("T"+i);
}
}
本回答被提问者采纳
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询