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