一道简单的(dp)题,主要在于进行了(2)次(dp)来解题
以时间为(dp)条件,路程为代价,(dp[i])表示i时刻最远路程。
第一次只考虑使用闪现,第二次在闪现的基础上考虑奔跑。
#include<bits/stdc++.h>
using namespace std;
inline int read() {
int ans=0;
char last = ' ',ch =getchar();
while(ch>'9'||ch<'0') last=ch,ch=getchar();
while(ch>='0'&&ch<='9') ans=(ans<<1)+(ans<<3)+ch-'0',ch=getchar();
if(last=='-') ans=-ans;
return ans;
}
int m,s,T;
int dp[300010];
int main() {
m=read();
s=read();
T=read();
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]=max(dp[i],dp[i-1]+17);
if(dp[i]>=s) {
printf("Yes
%d",i);
return 0;
}
}
printf("No
%d",dp[T]);
return 0;
}