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;
}

 

 

posted @ 2021-05-02 21:45  BlackSnow  阅读(104)  评论(0)    收藏  举报