判断梦想数
题目描述
梦想数定义,一直对数每位平方和相加操作,当循环中出现 1 则为梦想数
输入一个正整数,判断其是否为梦想数
例: 19
1^2 + 9^2 = 82
8^2 + 2^2 = 68
6^2 + 8^2 = 100
1^2 + 0^2 + 0^2 = 1
即 19 为梦想数
编码
// TODO
守望者的逃离
题目描述
法师住在一个村庄,一天发生雪崩,法师跑步速度为 13m/s,使用魔法 1s 可以移动 50m,但会花费 10 点魔法
法师初始魔法值 M,村庄到安全地的距离为 S,雪崩到达的时间为 T,法师恢复魔法速度为 4点/s,但是只有原地不动才可以恢复
输入
输入一行,包括3个非负整数M,S,T
输出
输出两行
第一行输出"Yes","No",表示是否到达安全地
第二行输出到达的时间或时未到达时达到的最大距离
编码
// 代码为自行编写,可能存在 Bug
import java.util.Scanner;
public class Main {
public static void main(String[] args) {
Scanner scn = new Scanner(System.in);
int m = scn.nextInt(), s = scn.nextInt(), t = scn.nextInt();
// count:初始魔法值能用几次 tAns:记录使用的时间 sAns:记录走过的路程 flag:此处标记剩余魔法值是否为 4 的倍数
int count = m/10, sAns = 0, tAns = 0, tt = 0, flag = (10-m%10)%10%4 == 0 ? 0 : 1;
if(m%10 > 1 && m%10/4 + flag <= t) { // tt记录下恢复到至少 10 点魔法值所需时间
tt = m%10 / 4 + flag;
}
flag = s%50 == 0 ? 0 : 1; // 此处标记路程是否为 50 的倍数
count = Math.min(count, Math.min(s/50+flag,t));
sAns += count * 50;
tAns += count;
if(tt != 0 && tt+1 <= t-tAns && tt*13 + sAns < s) { // 存在多余魔法值 未被淹没 使用等待的时间直接走不会到达目的地
sAns += 50;
tAns += tt + 1;
}
flag = (s-sAns)%13 == 0 ? 0 : 1; // 此处标记剩余路程为 13 的倍数
count = Math.min((s-sAns)/13+flag, (t-tAns));
sAns += count * 13;
tAns += count;
if(sAns < s) {
System.out.println("No");
System.out.println(sAns);
} else {
System.out.println("Yes");
System.out.println(tAns);
}
}
}
旅行路线
题目描述
有 N 座城市,M 条路线,现马可波罗想要去其中 R 个城市,请帮他制定一个最短路线。
路线为无向边,保证无重边
输入
第一行输入 N,M,R(2 <= N <= 200,1 <= M <=500,2 <= R <= min(22,N)
第二行输入 R 个城市的编号
之后 M 行每行输入x,y,z 表示城市 x 和城市 y 之间相距 z 米(z <= 10000)
输出
路线的最短距离
编码
// TODO
To Be Continue...