原题位置: https://www.luogu.org/problem/show?pid=1095
这个题好久之前就见过,当时写的贪心,但是没A;
刚刚换成了DP,A了;
所谓DP,我们可以把这个过程看做两个人在一起跑,只是跑的方式不同;
一个跳一下休息一会,一个一直跑;
所以这个东西就可以分成两个DP;
cpp
#include<iostream>
#include<cstdio>
#include<algorithm>
#define II int
#define R register
#define I 123465
using namespace std;
struct node {
II qi,s,shan;
}f[I];
II m,s,t;
int main()
{
scanf("%d%d%d",&f[0].qi,&s,&t);
// 初始化极为重要;
for(R II i=1;i<=t;i++)
{
if(f[i-1].qi>=10) {
f[i].qi=f[i-1].qi-10;
f[i].shan=f[i-1].shan+60;
} else {
f[i].shan=f[i-1].shan;
f[i].qi=f[i-1].qi+4;
}
// 前面是一个人跳着跑,累了就歇会;
f[i].s=max(f[i-1].s+17,f[i].shan);
// 这是另一个人在一直跑,不过他可以瞬间达到前一个人跳到的位置;
}
if(f[t].s>=s) {
// 如果可以超过总长;
for(R II i=1;i<=t;i++)
{
if(f[i].s>=s) {
printf("Yes\n%d",i);
exit(0);
}
}
} else {
// 否则;
printf("No\n%d",max(f[t].s,f[t].shan));
}
exit(0);
}
by pretend_fal
END;