出题人的徒弟 lcw 最近在玩皇室战争,他召唤了骷髅军团来进攻对方的公主塔。
公主塔的生命值为 hp,攻击力为 atk,骷髅军团一共有 n个骷髅,每个骷髅的生命值为 h,攻击力为 a。
从第一秒开始,每一秒的前半秒,每只骷髅都会对公主塔进行一次攻击,使之 hp 减少 a;后半秒,公主塔对某一个骷髅进行一次攻击,对其造成 atk 的伤害,一个骷髅会死去当且仅当其生命值减到 0 或负数,骷髅死去后不会继续攻击。
公主塔会采取最优的策略以争取时间,国王塔会在第 t 秒的后半秒释放一个火球术,届时所有骷髅都会被消灭。
lcw 想知道对方的公主塔最后能否被骷髅军团摧毁(即生命值是否减到 ≤0)。
第一行一个正整数 T 表示有多少组测试数据;
接下来 T 行,每行六个正整数 hp,atk,n,h,a,t。
| 测试点编号 | hp | atk,n,h,a,t | 特殊约定 |
|---|---|---|---|
| 1,2,3 | ≤10 | ≤10 | 无 |
| 4,5,6 | ≤1012 | ≤40000 | atk≥h |
| 7,8,9,10 | ≤1012 | ≤40000 | 无 |
对于全部测试点 T≤10^5。
T 行,每一行输出"Yes"或"No"表示对方的公主塔能否被摧毁。
2
5 1 3 2 1 3
9 1 3 2 1 3
Yes
No
解析:推数学公式,先算杀一只需要多少秒,然后第1~k秒会受到a*n的伤害,k+1~2k+1秒会受到a*(n-1),以此类推一共t/k组都是满足k个,如果最后一组会剩下t%k个,然后计算一下伤害值,累加判断是否小于hp。
不过需要先判断是否火球来之前就已经消灭全部,上面推的公式只适用于火球来的时候还剩有骷髅。
#include
const int N=1e5+5;
typedef long long ll;
void solve()
{ll hp,v,n,h,a,t;scanf("%lld%lld%lld%lld%lld%lld",&hp,&v,&n,&h,&a,&t);ll k=(h-1)/v+1,m=t/k,sum;//k表示杀一只所需时间if(k*n<=t) sum=((n*n+n)/2)*a*k;//如果火球来之前能直接杀完else sum=(m*n*a-a*((m*m-m)/2))*k+(n-m)*a*(t%k);if(hp>sum) printf("No\n");else printf("Yes\n");
}
int main()
{int t;scanf("%d",&t);while(t--) solve();return 0;
}