//题目 2318: [传智杯]补刀
//题目解析:输入第一行,包含一个正整数 T,表示数据组数。
//接下来 T 行,每行三个非负整数 h,x,y,其意义已经在题目描述中给出。
//我们假设这个小兵有 h 点的生命值。每次防御塔的攻击可以给小兵造成 x 点伤害,而你的英雄每次攻击可以给小兵造成 y 点伤害。
//你的攻击速度和防御塔攻击速度相同,所以你可以在防御塔第一次攻击小兵之前,或者每次防御塔攻击之后,选择是否对小兵进行一次攻击,当然你也可以选择不攻击。
//解题关键:如何解决先出手或者慢出手原理
```c
#includeint main()
{
int I,T;
long int h,x,y;//这里定义h代表小兵血量,x代表防御塔给小兵造成的x点伤害,y代表你每次出手可以造成的伤害,这里设置int整形类型是应为通过整数进行计算伤害更加容易!
long int i,A;
int flag;
scanf("%d",&T);//这里表示的是循环次数,代表有多少个小兵
for(I=T;I>0;I--)
{
scanf("%ld %ld %ld",&h,&x,&y);
if(!y)
{
printf("No\n");//代表英雄没有攻击能力,无法攻击(出现了被眩晕,致盲等等)
continue;
}
else if(!x||y>=h)//例如王者荣耀里面的召唤师技能中的干扰一样没有进行对小兵或者英雄攻击
{
printf("Yes\n");//代表英雄具有攻击能力并且能有一发平A带走小兵
continue;
}
flag=0; //设置标志
//在这里就有问题了,如果说都是没法英雄或者防御塔一发将其小兵打死呢?这里就要进行判断是先出手还是后出手
A=h/x; //塔需要A次攻击能杀死小兵
if(h%x==0) A--; //如果塔A次攻击杀死小兵就让A减1,保证英雄具有出手击打小兵的机会从而完成补兵过程
for(i=1;i<=A+1;++i)
{
//英雄要想杀死怪,最少需要1次攻击(塔攻击A次以后,英雄补最后一刀),最多需要A+1次(在塔第一次攻击怪之前,英雄攻击一次,以后塔每攻击一次英雄随后攻击一次)
if(i*y+A*x>=h)
//这里做个小解释:如果防御塔一次攻击为50,小兵生命为101,英雄攻击力为1,这里就需要防御塔攻击2次!第三次才到英雄出手!
{
//如果塔的A次攻击造成的伤害加上英雄i次攻击造成的伤害大于怪的血量,代表英雄可以在塔的A次攻击间隔中选择i-1次进行攻击,在塔第A次攻击后发动第i次攻击杀死怪,表示英雄可以补刀,置flag为true,并结束循环
flag=1;
break;
}
else
flag=0;
}
//输出结果
if(flag==1) printf("Yes\n");
else printf("No\n");
}
return 0;
}
```