[//]: # 这个题目开始上来就想用二维数组表示状态来计算最远距离。f[i][j],表示用了前i秒用了j的魔法值能走的最远的距离,计算了半天没有实现,最后看了y总的思路,才知道,dp也可以分两次来求值的。前面做的dp,多是一次dp就可以求出想要的答案了
java 代码
import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.util.StringTokenizer;
public class Main {
static int m,s,t;
static int N = 300010;
static int f[]=new int[N];
public static void main(String[] args)throws Exception {
BufferedReader br=new BufferedReader(new InputStreamReader(System.in));
StringTokenizer st=new StringTokenizer(br.readLine());
m= Integer.parseInt(st.nextToken());
s= Integer.parseInt(st.nextToken());
t= Integer.parseInt(st.nextToken());
//开始的时候尽可能多的用技能去跑
for(int i=1;i<=t;i++){
if(m>=10){
f[i]=f[i-1]+60;
m-=10;
}else {
f[i]=f[i-1];//这一秒什么都没有干,就等着恢复魔法值
m+=4;
}
}
//开始用跑步的方式来求取长度
for(int i=1;i<=t;i++){
f[i]=Math.max(f[i],f[i-1]+17);
}
boolean flag=false;
for(int i=1;i<=t;i++){
if(f[i]>s){
flag=true;
System.out.println("Yes");
System.out.println(i);
break;
}
}
if(!flag){
System.out.println("No");
System.out.println(f[t]);
}
}
}