骷髅军团 (模拟)

题干

在这里插入图片描述
在这里插入图片描述

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

猜你喜欢

转载自blog.csdn.net/DAVID3A/article/details/115357921