#include<stdio.h>
/*m,s,t分别代表初始魔法值、距离、时间
*psT和*pDist用作传出参数,*pDist用来返回最远能跑的距离,如果能够跑出来
则它一定大于等于s。如果能够跑出来,*psT返回跑出来的最短时间*/
void
Escape
(
int
m
,
int
s
,
int
t
,
int
*
psT
,
int
*
pDist
)
{
if
(
t
<=
0
&&
s
>
0
)
{
*
pDist
=
0
;
return
;
}
if
(
s
<=
0
)
{
*
psT
=
0
;
return
;
}
int
sT1
=
0
,
sT2
=
0
,
Dist1
=
0
,
Dist2
=
0
;
if
(
m
>=
10
&&
s
>
60
)
{
*
psT
=
1
;
*
pDist
=
60
;
Escape
(
m
-
10
,
t
-
1
,
s
-
60
,
&
sT1
,
&
Dist1
);
}
if
(
m
>=
10
&&
s
<=
60
)
{
*
psT
=
1
;
*
pDist
=
s
;
}
/*这里是最基本的情况,但里面有几种情况,需要细分*/
if
(
m
<
10
&&
s
<=
60
)
{
int
RecoverT
;
//魔法恢复到10以上的时间
if
(
m
<
2
)
RecoverT
=
1000000
;
if
(
m
>=
2
&&
m
<
6
)
RecoverT
=
2
;
if
(
m
>=
6
&&
m
<=
9
)
RecoverT
=
1
;
if
(
t
*
17
>=
s
||
RecoverT
+
1
<=
t
)
//满足这一条件则能够逃出去
{
*
pDist
=
s
;
if
(
s
<=
17
)
*
psT
=
1
;
else
if
(
s
>
17
&&
s
<=
34
)
*
psT
=
2
;
else
if
(
s
>
34
&&
s
<=
51
)
{
if
(
RecoverT
==
1
)
*
psT
=
2
;
else
*
psT
=
3
;
}
else
if
(
s
>=
51
)
{
if
(
RecoverT
>
10
)
*
psT
=
4
;
else
*
psT
=
RecoverT
+
1
;
}
}
else
//如果逃不出去,只需算pdist,
{
*
pDist
=
t
*
17
;
}
}
if
(
m
<
10
&&
s
>
60
)
{
if
(
m
<=
1
)
{
if
(
s
>=
120
)
//只要距离大于120m,则前120m用两次魔法是最快的(7s)
{
//如果用奔跑则7s只能跑119m
if
(
t
>=
7
)
//有足够时间用两次魔法,有机会逃出去,可以化简到其它情况
{
*
psT
=
7
;
*
pDist
=
120
;
Escape
(
m
,
s
-
120
,
t
-
7
,
&
sT2
,
&
Dist2
);
}
else
//t < 7,一定逃不出去了
{
*
pDist
=
17
*
t
;
}
}
else
//小于120m,那么采用奔跑更快,可以递归到简单情况
{
*
psT
=
1
;
*
pDist
=
17
;
Escape
(
m
,
s
-
17
,
t
-
1
,
&
sT2
,
&
Dist2
);
}
}
else
if
(
m
>=
2
&&
m
<
6
)
//只需两秒可以有超过十个魔力,用魔法3s可以跑60m,因此用掉魔法再说
{
if
(
t
>=
3
)
//有机会用一次魔法,并且可以递归到其它情况
{
*
pDist
=
60
;
*
psT
=
3
;
Escape
(
m
-
2
,
s
-
60
,
t
-
3
,
&
sT2
,
&
Dist2
);
}
else
//(t < 3) 跑不出去,用不了魔法,只需计算最远能跑的距离
{
*
pDist
=
17
*
t
;
}
}
else
// m >= 6
{
if
(
t
>=
2
)
//有机会用一次魔法,可以递归到其它情况
{
*
pDist
=
60
;
*
psT
=
2
;
Escape
(
m
-
6
,
s
-
60
,
t
-
2
,
&
sT2
,
&
Dist2
);
}
else
//没机会用魔法,逃不出去,只需计算最远能跑的距离
{
*
pDist
=
t
*
17
;
}
}
}
*
psT
=
*
psT
+
sT1
+
sT2
;
//将每个阶段所花的时间加起来
*
pDist
=
*
pDist
+
Dist1
+
Dist2
;
//每个阶段跑的距离加起来
}
int
main
()
{
int
s
,
t
,
m
;
int
sT
=
0
,
Dist
=
0
;
scanf
(
"%d %d %d"
,
&
m
,
&
s
,
&
t
);
Escape
(
m
,
s
,
t
,
&
sT
,
&
Dist
);
if
(
Dist
<
s
)
printf
(
"No %d"
,
Dist
);
else
printf
(
"Yes %d"
,
sT
);
return
0
;
}