https://codeforces.com/contest/1434/problem/C
vp的时候没写出来,写了一年= =,看了下前面人的代码,发现可以巨简单的直接计算。。。
经典计算题搞不清楚
首先如果a>b*c的话,也就是一次伤害比回血多,那么就无限血也可以击杀了
否则如果c<=d,也就是在回血结束之后,才能放新的技能,由于a<=b*c,可知从第二次放技能开始肯定没第一次放技能血量低,那么答案就直接是a
那么我们可以计算出当释放k=a/b/d+1次技能时,血量会达到最小值,a/b表示释放了第一次技能,a伤害被后续多少时间的b回血给抵消,抵消了再释放一次新的a肯定不优,那么由于技能的冷却时间是d,所以a/b/d+1表示在第一次技能之后还可以放几次技能,使得第一次技能的扣血还没有被填满。
第一次释放技能时间在0,最后结束的时间就是(k-1)*d,第一次技能导致的回血就是(k-1)*d*b,第二次(k-2)*d*b....依次下去,直接等差数列求和就行了
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const int maxl=3e5+10;
int n,m,cnt,tot,cas;ll ans;
ll a,b,c,d;
bool vis[maxl];
char s[maxl];
inline void prework()
{
scanf("%lld%lld%lld%lld",&a,&b,&c,&d);
}
inline void mainwork()
{
if(a>b*c)
{
ans=-1;
return;
}
if(c<=d)
{
ans=a;
return;
}
ll k=a/b/d+1;
ans=k*a-k*(k-1)/2*d*b;
}
inline void print()
{
printf("%lld\n",ans);
}
int main()
{
int t=1;
scanf("%d",&t);
for(cas=1;cas<=t;cas++)
{
prework();
mainwork();
print();
}
return 0;
}