1.问题描述
话说这个世界上有各种各样的兔子和乌龟,但是研究发现,所有的兔子和乌龟都有一个共同的特点——喜欢赛跑。于是世界上各个角落都不断在发生着乌龟和兔子的比赛,小华对此很感兴趣,于是决定研究不同兔子和乌龟的赛跑。他发现,兔子虽然跑比乌龟快,但它们有众所周知的毛病——骄傲且懒惰,于是在与乌龟的比赛中,一旦任一秒结束后兔子发现自己领先t米或以上(审题错误不是每t米休息s秒而是达到这个条件后才休息),它们就会停下来休息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
version1
/**
* Copyright (C), 2015-2019
* FileName: Race
* Author: zun
* Date: 2019/2/19 16:55
* Description: 龟兔赛跑预测
* History:
* <author> <time> <version> <desc>
* 作者姓名 修改时间 版本号 描述
*/
import java.util.Scanner;
/**
* 〈一句话功能简述〉
* 〈龟兔赛跑预测〉
*
* @author zun
* @create 2019/2/19
* @since 1.0.0
*/
public class Race {
public static void main(String[] args){
Scanner in=new Scanner(System.in);
int v1=in.nextInt();
int v2=in.nextInt();
int t=in.nextInt();
int s=in.nextInt();
int l=in.nextInt();
int r_time=0;
int t_time=l/v2;
int r_l=0,t_l=0;
while(r_l!=l){
if(r_l>t_l){
t_l=t_l+(r_l-t_l)/t*s*v2;
r_time+=s;
}
else {
r_l=r_l+v1;
t_l=t_l+v2;
r_time++;
}}
if(r_time>t_time){
System.out.println("T"+"\n"+t_time);
}
else if(r_time<t_time){
System.out.println("R"+"\n"+r_time);
}
else {
System.out.println("D"+"\n"+r_time);
}
}
}
运行超时
/**
* Copyright (C), 2015-2019
* FileName: Race
* Author: zun
* Date: 2019/2/19 16:55
* Description: 龟兔赛跑预测
* History:
* <author> <time> <version> <desc>
* 作者姓名 修改时间 版本号 描述
*/
import java.util.Scanner;
/**
* 〈一句话功能简述〉
* 〈龟兔赛跑预测〉
*
* @author zun
* @create 2019/2/19
* @since 1.0.0
*/
public class Race {
public static void main(String[] args){
Scanner in=new Scanner(System.in);
int v1=in.nextInt();
int v2=in.nextInt();
int t=in.nextInt();
int s=in.nextInt();
int l=in.nextInt();
int r_time=0;
int t_time=l/v2;
int r_l=0,t_l=0;
while(r_l!=l){
if(r_l-t_l>=t){
t_l=t_l+s*v2;
r_time+=s;
}
else{
r_l=r_l+v1;
t_l=t_l+v2;
r_time++;}
}
if(r_time>t_time){
System.out.println("T"+"\n"+t_time);
}
else if(r_time<t_time){
System.out.println("R"+"\n"+r_time);
}
else {
System.out.println("D"+"\n"+r_time);
}
}
}
2.有n(2≤n≤20)块芯片,有好有坏,已知好芯片比坏芯片多。
每个芯片都能用来测试其他芯片。用好芯片测试其他芯片时,能正确给出被测试芯片是好还是坏。而用坏芯片测试其他芯片时,会随机给出好或是坏的测试结果(即此结果与被测试芯片实际的好坏无关)。
给出所有芯片的测试结果,问哪些芯片是好芯片。
输入格式
输入数据第一行为一个整数n,表示芯片个数。
第二行到第n+1行为n*n的一张表,每行n个数据。表中的每个数据为0或1,在这n行中的第i行第j列(1≤i, j≤n)的数据表示用第i块芯片测试第j块芯片时得到的测试结果,1表示好,0表示坏,i=j时一律为1(并不表示该芯片对本身的测试结果。芯片不能对本身进行测试)。
输出格式
按从小到大的顺序输出所有好芯片的编号
样例输入
3
1 0 1
0 1 0
1 0 1
样例输出
1 3
/**
* Copyright (C), 2015-2019
* FileName: ClipsTest
* Author: zun
* Date: 2019/2/19 18:26
* Description: 芯片测试
* History:
* <author> <time> <version> <desc>
* 作者姓名 修改时间 版本号 描述
*/
import java.util.Scanner;
/**
* 〈一句话功能简述〉
* 〈芯片测试〉
*
* @author zun
* @create 2019/2/19
* @since 1.0.0
*/
public class ClipsTest {
public static void main(String[] args){
Scanner input=new Scanner(System.in);
int n=input.nextInt();
int[][] num=new int[n][n];
for(int i=0;i<n;i++){
for(int j=0;j<n;j++){
if(j==0)
{
int t=input.nextInt();
if(t==1){
System.out.print(i+1+" ");
}
}
}}}}
思路 第一列所有为1的芯片就是好芯片
3.问题描述
FJ在沙盘上写了这样一些字符串:
A1 = “A”
A2 = “ABA”
A3 = “ABACABA”
A4 = “ABACABADABACABA”
… …
你能找出其中的规律并写所有的数列AN吗?
输入格式
仅有一个数:N ≤ 26。
输出格式
请输出相应的字符串AN,以一个换行符结束。输出中不得含有多余的空格或换行、回车符。
样例输入
3
样例输出
ABACABA
思路:
3-c
然后两边关于c对称
使用递归算法
/**
* Copyright (C), 2015-2019
* FileName: FJString
* Author: zun
* Date: 2019/2/19 18:36
* Description: fj字符串 找规律
* History:
* <author> <time> <version> <desc>
* 作者姓名 修改时间 版本号 描述
*/
import java.util.Scanner;
/**
* 〈一句话功能简述〉
* 〈fj字符串 找规律〉
*
* @author zun
* @create 2019/2/19
* @since 1.0.0
*/
public class FJString {
public static String getString(int n){
if(n==1){
return "A";
}
else {
String str = getString(n - 1) + (char) ('A' + n-1) + getString(n - 1);
return str;}
}
public static void main(String[] args){
Scanner s=new Scanner(System.in);
int n=s.nextInt();
System.out.println(getString(n));
}
}
最近FJ为他的奶牛们开设了数学分析课,FJ知道若要学好这门课,必须有一个好的三角函数基本功。所以他准备和奶牛们做一个“Sine之舞”的游戏,寓教于乐,提高奶牛们的计算能力。
不妨设
An=sin(1–sin(2+sin(3–sin(4+...sin(n))...)
Sn=(...(A1+n)A2+n-1)A3+...+2)An+1
FJ想让奶牛们计算Sn的值,请你帮助FJ打印出Sn的完整表达式,以方便奶牛们做题。
输入格式
仅有一个数:N<201。
输出格式
请输出相应的表达式Sn,以一个换行符结束。输出中不得含有多余的空格或换行、回车符。
样例输入
3
样例输出
/**
* Copyright (C), 2015-2019
* FileName: Sine
* Author: zun
* Date: 2019/2/19 18:58
* Description: Sine之舞
* History:
* <author> <time> <version> <desc>
* 作者姓名 修改时间 版本号 描述
*/
import java.util.Scanner;
/**
* 〈一句话功能简述〉
* 〈Sine之舞〉
*
* @author zun
* @create 2019/2/19
* @since 1.0.0
*/
public class Sine {
static int n;
public static void An(int N,int t)
{
if (N == t)
{
System.out.printf("sin(%d)",N);
return ;
}
System.out.printf("sin(%d",N);
if (N < t)
{
if (N%2==0)
{
System.out.printf(" - ");
}
else
{
System.out.printf("+");
}
An(N+1,t);
}
System.out.printf(")");
}
public static void Sn(int N,int t)
{
if (N > 1)
{
System.out.printf("(");
Sn(N-1,t+1);
}
An(1,N);
System.out.printf("+%d",t);
if (N!=n){
System.out.printf(")");}
}
public static void main(String[] args){
Scanner s= new Scanner(System.in);
n=s.nextInt();
Sn(n,1);
}
}