小さな家族は、ライを逃げました
タイトル説明
マスターは、村でのアバランシェ日マスター走行速度に住んでいた13メートル/ Sを魔法の使用、1秒を動かす50メートルを、しかし差し引かれます10マナ・
マスター初期マナMを、村の距離が安全であるS、雪崩リーチ時間をT、マスター回復魔法スピード午前4時00分/ Sが、唯一の停滞を回復することができます
エントリー
3非負整数M、S、Tを備え、入力ライン、
輸出
2本の出力線
の出力の最初の行の「はい」、「いいえ」、安全な到着するかどうかを示す
か、2行目の不達が最大距離の到着の出力時間に達します
サンプル入力
36 255 10
サンプル出力
はい
10
考え
脱出する方法の二種類、実行して使用して魔法、直接欲できます
- 十分な魔法の値の下では、使用することができるM / 10エスケープ魔法の時間を
- 計算可能な、時に残り時間のマナ> = 2、魔法が直接実行上の優位性を持つことになります一度の回復を待つ
注:もちろん、あなたがに焦点を当てる必要があります時間は十分あるあなただけでなく、安全距離あなたが13メートルを休ませる必要があり、魔法の時間を使用するために待つ必要はありません - マナは、残りの時間はもちろん、直接実行され、最大使用されています。。。
コーディング
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);
}
}
}
小さな家族経営の旅程
タイトル説明
今マルコポーロRの都市に行きたい都市、M Nブロックのルートは、ありますが、彼は開発を支援してください最短ルートを。
無向エッジのためのコースを確保しないように何の重い側を
エントリー
最初の入力ラインN、M、R(2 < = N <= 200,1 <= M <= 500,2 <= R <=分(22、N)、
第二の入力ライン番号R都市
M行後ラインX、Yごとに、zは都市および都市Y Z X M(Z <= 10000)との間の距離を表します
輸出
最短距離経路
サンプル入力
4 6 3
2 3 4
1 2 4
2 3 3
4 3 1
1 4 1
4 2 2
3 1 6
サンプル出力
3
考え
検索トラバースへの
出発点は、街に行く必要があることが必要
条件に戻り、すべての都市に行く必要がしてきた
ANSとのパスを比較することにより、カットさ(最短経路検索履歴表示されます)長いルートの一部
コーディング
import java.util.HashSet;
import java.util.Scanner;
import java.util.Set;
public class Main {
private static int[][] map; // 邻接矩阵记录路线
private static int[] vis; // 记录是否去过某城市
private static Set<Integer> set; // 记录是否去过需要去的城市
private static int n, ans = Integer.MAX_VALUE; // ans 记录最短路径
private static int dfs(int x, int s) {
if(s > ans) return Integer.MAX_VALUE; // 超过之前的最优路径,没必要继续走
if(set.isEmpty()) return s; // 需要去的城市都去过,即找到路线
int tmp = Integer.MAX_VALUE; // 记录到达 x 之后, 后面的最短路线
for(int i = 1; i <= n; ++i) {
if(map[x][i] > 0 && vis[i] == 0) {
boolean flag = set.remove(i);
vis[i] = 1;
tmp = Math.min(dfs(i, s+map[x][i]), tmp);
vis[i] = 0;
if(flag) set.add(i);
}
}
return tmp;
}
public static void main(String[] args) {
Scanner scn = new Scanner(System.in);
n = scn.nextInt();
int m = scn.nextInt(), r = scn.nextInt();
map = new int[n+1][n+1];
vis = new int[n+1];
set = new HashSet<Integer>();
for(int i = 0; i < r; ++i) {
set.add(scn.nextInt());
}
for(int i = 0; i < m; ++i) {
int x = scn.nextInt(), y = scn.nextInt(), z = scn.nextInt();
map[x][y] = map[y][x] = z;
}
for(int i = 1; i < n; ++i) {
if(set.contains(i)) { // 只有需要去的城市才作为起点进行搜索
set.remove(i);
vis[i] = 1;
ans = Math.min(dfs(i, 0), ans);
vis[i] = 0;
set.add(i);
}
}
System.out.println(ans);
}
}