代码如下(纯dp无太多优化,最后一个点300ms,时间复杂度不算太差)
using namespace std;
int f[300001][1001];//时间和法力值 存储的是距离
int m,s,t;
int anss=0;//用来更新距离,以便不能到达时输出最远的距离
int main()
{
cin>>m>>s>>t;
for(int i=1;i<=t;i++)
{
for(int j=m;j>=0;j--)
{
if(j>=10)//法力值够用,贪心,能闪则闪
{
if(f[i-1][j]+60>f[i][j])f[i][j-10]=f[i-1][j]+60;
anss=max(anss,f[i][j-10]);
}
else //法力值不够用就存法力值或者直接跑17m
{
if(f[i-1][j]>f[i][j+4])f[i][j+4]=f[i-1][j];
if(f[i-1][j]+17>f[i][j])f[i][j]=f[i-1][j]+17;
anss=max(anss,max(f[i][j+4],f[i][j]));
}
if(f[i][j]>=s)//如果距离够了就输出
{
cout<<"Yes"<<endl;
cout<<i<<endl;
return 0;
}
else anss=max(anss,f[i][j]);//距离不够就更新得到更远的距离
}
}
cout<<"No"<<endl;
cout<<anss<<endl;
return 0;
}