题目链接:https://www.luogu.org/problemnew/show/P1095
题意理解
这题其实最近做过一条差不多的,吃鸡跑毒那条。但是还是不一样。
由于考虑的是最短时间和最长路程,根据数字的大小来看,表示每一时刻能跑的最长路程,应该是最靠谱的,并且也符合题目要求。
那么如何表示每个时刻能跑的最长路程呢?可以考虑暴力搜索,但是看看这个T大小,好像不是很好做。
第一步应该想到,一开始是全部都是闪烁。然后算一下,使用闪烁加休息的方法,可以做到3.5s跑60米。这个速度是优于跑步的。因此在后面可以休息到可以闪烁一次,就闪烁。但是由于考虑的是每个时刻能跑的最大距离,因此有可能有时候就需要把休息变成跑步。但是这个不会影响到后继的状态,因为休息加闪烁的距离,是在一开始求出来的。
代码
import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.util.StringTokenizer;
public class Main {
static int M, S, T;
static int[] dp;
public static void main(String[] args) {
FastScanner fs = new FastScanner();
M = fs.nextInt();
S = fs.nextInt();
T = fs.nextInt();
dp = new int[T + 5];
for(int i = 1; i <= T; i++) {
if(M >= 10) {
dp[i] = dp[i-1] + 60;
M -= 10;
} else {
dp[i] = dp[i-1];
M += 4;
}
}
for(int i = 1; i <= T; i++) {
dp[i] = Math.max(dp[i-1] + 17, dp[i]);
if(dp[i] >= S) {
System.out.println("Yes");
System.out.println(i);
return;
}
}
System.out.println("No");
System.out.println(dp[T]);
}
public static class FastScanner {
private BufferedReader br;
private StringTokenizer st;
public void eat(String s) {
st = new StringTokenizer(s);
}
public FastScanner() {
br = new BufferedReader(new InputStreamReader(System.in));
eat("");
}
public String nextLine() {
try {
return br.readLine();
} catch (Exception e) {
// TODO: handle exception
}
return null;
}
public boolean hasNext() {
while(!st.hasMoreTokens()) {
String s = nextLine();
if(s == null) {
return false;
}
eat(s);
}
return true;
}
public String nextToken() {
hasNext();
return st.nextToken();
}
public int nextInt() {
return Integer.valueOf(nextToken());
}
}
}