Mission Possible
题目:
一个人从起点出发,要走距离D,
每秒他会持续受到A点伤害(即不是直接在这秒开始或结束统一扣血,是在这1s内均摊的),
初始血量H=0,速度V=0,每秒生命回复R=0(每秒末回复R点生命值,瞬时回血而非持续)。
提升一点血量、速度、生命回复的花费分别为G1、G2、G3。
要求走到终点的过程中,生命值不能小于0(可以等于0),
且提升速度不能超过D,问最小花费是多少。
1 <= D,A <= 500000, 1 <= G1, G2, G3 <= 200
题解:
首先由速度不能超过D,想到枚举速度1到D,
枚举速度v,从起点到终点的时间t就固定下来了,
在速度上的花费v*G[2]①也确定下来了,
血量应至少为A,否则第一秒就死了,花费为A*G[1]②
剩余的时间为D/v-1,考虑回血和初始血量满足条件两种情形,
回血,只需满足R==A即可,花费为A*G[3]③,
初始血量够,还需血量A*(D/v-1),血量需向上取整,花费为A*(D/v-1)*G[1]③
枚举v,取一个①+②+③的最小值即可,式子可进一步化简
#include<iostream> #include<cstdio> #include<cmath> using namespace std; typedef long long ll; int main() { int t; cin>>t; int cnt=1; while(t--) { ll D,A,g1,g2,g3; cin>>D>>A>>g1>>g2>>g3; printf("Case #%d: ",cnt++); ll ans=LLONG_MAX; for(int v=1;v<=D;v++) { ans=min(ans,g2*v+min((ll)ceil(1.0 * A * D / v) * g1, A * (g1 + g3))); } cout<<ans<<endl; } return 0; }

浙公网安备 33010602011771号