codeforces1434C. Solo mid Oracle

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;
}

猜你喜欢

转载自blog.csdn.net/liufengwei1/article/details/109342895