Codeforces 1435E/1434C Solo mid Oracle
题意
你有一个技能,每次使用可以使敌方英雄的血量减少(a),并在(c)秒内每秒回复(b)点生命值,技能的冷却时间为(d)。问在你能击败的敌方英雄的血量最大为多少。
分析
当(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;
}