题干
Sample Input
2
5 1 3 2 1 3
9 1 3 2 1 3
Sample Output
Yes
No
想法
这道题要模拟骷髅对公主塔的攻击。我们可以把骷髅的攻击动态累加,(在累加的过程中公主塔对骷髅有攻击,因此骷髅数量是线性减少的),那么累加到t之前,只要总攻击量大于等于公主塔血量,则输出Yes
假设公主杀死一个骷髅需要m次,那么m如何计算呢?
m = h / atk;
if(h%atk!=0)m++;
那么m下就能杀死一个骷髅。那么前m秒造成的伤害就是man,m+1到2m秒死掉了一个骷髅,因此伤害变成了ma*(n-1),很显然,能看出一直到最后如果没有火球必杀技,一直累加到1就可以了,可是现在有火球必杀,所以要计算抗到t时公主塔要承接多少伤害。
设 k 表示有几个经历了 m秒的时段:
k = min(n,t/m)
则总伤害就是m*a*(n+(n-1)+(n-2)+····+(n-k+1))
,最后还有一点残余a*(n-k)*(t%m)
需要累加
AC代码
#include<bits/stdc++.h>
using namespace std;
#define rep(i,a,b) for(int i=a;i<=b;++i)
#define pre(i,a,b) for(int i=a;i>=b;--i)
#define m(x) memset(x,0,sizeof x);
#define ll long long
const int maxn = 1050;
const int N = 1000;
//快速读
ll read(ll x=0)
{
ll c, f=1;
for(c=getchar();!isdigit(c);c=getchar())if(c=='-')f=-f;
for(;isdigit(c);c=getchar())x=x*10+c-48;
return f*x;
}
int main()
{
ll T, hp, atk, n, h, a, t, m, k, d;
T=read();
while(T--)
{
hp=read(), atk=read(), n=read(), h=read(), a=read(), t=read();
m = h / atk;
if(h%atk!=0)m++;
k=min(n,t/m);
d=a*m*(n+n-k+1)*k/2;
d+=a*(n-k)*(t%m);
if(d>=hp)printf("Yes\n");
else printf("No\n");
}
return 0;
}