Codeforces 1435E/1434C Solo mid Oracle 数学

Codeforces 1435E/1434C Solo mid Oracle

题意

你有一个技能,每次使用可以使敌方英雄的血量减少(a),并在(c)秒内每秒回复(b)点生命值,技能的冷却时间为(d)。问在你能击败的敌方英雄的血量最大为多少。

分析

img

(a>b cdot c)时,怪物血量可以无限大,答案为(-1)

(a<=bcdot c)时,只考虑使用技能的时间点(t),从图中可以分析出,当(t>=c)时,(d)秒内总回血量大于等于(bcdot c),回血大于等于(a)了,所以答案只可能在(t<c)的时刻取得,而(t<c)时,从图中能看出,每次施法造成的实际伤害为(a,a-bd,a-2bd,dots.a-kbd),所以我们只要找到最大的(k)使得(a-kbd>=0),答案即为(a(k+1)-frac{k(k+1)}{2}bd)

Code

#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
int t;
ll a,b,c,d;
int main(){
    cin>>t;
    while(t--){
        cin>>a>>b>>c>>d;
        if(b*c<a){
            puts("-1");
            continue;
        }
        if(c<=d){
            cout<<a<<endl;
        }else{
            ll k=a/(d*b);
            ll ans=a*(k+1)-(1+k)*k/2*b*d;
            cout<<ans<<endl;
        }
    }
    return 0;
}
原文地址:https://www.cnblogs.com/xyq0220/p/13881139.html