Codeforces 1435E/1434C Solo mid Oracle 数学

Codeforces 1435E/1434C Solo mid Oracle

题意

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

分析

img

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

\(a<=b\cdot c\)时,只考虑使用技能的时间点\(t\),从图中可以分析出,当\(t>=c\)时,\(d\)秒内总回血量大于等于\(b\cdot 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;
}
posted @ 2020-10-26 20:52  xyq0220  阅读(224)  评论(0编辑  收藏  举报