PTA 7-333 晨阳哥哥lol之推塔
分数 20
作者 蔡尚真
单位 绍兴文理学院元培学院
在非常流行的LOL游戏中,想要获胜,必须要推塔,推塔会为全队带来经济收益和经验收益,所以在很多情况下我们要尽力推掉一座塔。
现在假设我们在敌方塔下,我们知道自身当前血量X,自身攻击力K,敌方塔下有N(N<=20)只己方小兵,每个小兵血量为x[i],攻击力为k[i],没有敌方小兵,防御塔生命值为A,攻击力B,我们都知道,即使小兵只剩下一点血,也会消耗防御塔一次攻击,假设小兵,英雄,防御塔攻击速度相等,且防御塔优先攻击第一发,为了计算方便,假设防御塔会按照顺序(x[1]~x[n])攻击小兵。
你的任务是判断可否推掉塔。
输入格式:
第一行先输入测试组数T,表示有T组测试数据。
第二行输入英雄生命值X,攻击力K。
第三行输入小兵数量N,随后每行行输入第i只小兵的血量x[i]和攻击力k[i]。
最后输入防御塔的血量和攻击力。
输出格式:
如果在我方死光前推掉防御塔,输出YES,否则输出NO。
输入样例:
在这里给出一组输入。例如:
3
1000 50
3
10 10
10 10
10 10
500 20
100 50
2
10 10
10 10
500 10
2000 100
5
100 30
200 50
100 30
50 80
50 80
3000 200
输出样例:
在这里给出相应的输出。例如:
YES
YES
NO
代码长度限制
16 KB
时间限制
400 ms
内存限制
64 MB
#include <stdio.h>
struct data{ //定义结构体
int HP; //生命值
int ATK; //攻击力
};
int main(){
int T;
int batmanNumb; //小兵数量
scanf("%d", &T);
while(T--){
struct data hero; //英雄结构变量
scanf("%d %d", &hero.HP, &hero.ATK);
scanf("%d", &batmanNumb);
struct data batman[batmanNumb]; //小兵结构变量
for(int i = 0; i < batmanNumb; i++){
scanf("%d %d", &batman[i].HP, &batman[i].ATK);
}
struct data MTD; //防御塔结构变量
scanf("%d %d", &MTD.HP, &MTD.ATK);
int p = batmanNumb; //剩余小兵数量
int q = 0; //数组下标
int r = 0;
while(1){
batman[q].HP -= MTD.ATK; //防御塔优先攻击第一次
if(batman[q].HP <= 0){ //当前小兵阵亡时
p--; //小兵数量-1
r++; //r前的小兵阵亡,从第r只小兵开始攻击
q++;
}
for(int i = r; i < p; i++){ //剩余小兵攻击防御塔
MTD.HP -= batman[p].ATK;
}
if(batman[batmanNumb-1].HP <= 0){ //小兵全部阵亡后
hero.HP -= MTD.ATK;
}
MTD.HP -= hero.ATK; //英雄攻击防御塔
if(MTD.HP <= 0){ //防御塔阵亡
printf("YES\n");
break;
}else if(hero.HP <= 0){ //英雄和小兵阵亡
printf("NO\n");
break;
}
}
}
return 0;
}
解题思路:
step1:定义结构体储存数据
step2:防御塔优先攻击第一个小兵,考虑第一小兵是否阵亡,若阵亡就不攻击;但是其他小兵和英雄会攻击防御塔,求出当前所有单位的生命值,然后进行下一次攻击
step3:当小兵全部阵亡时,,考虑英雄的攻击,只到防御塔阵亡或者英雄阵亡
step4:输出"YES"或"NO"
归属知识点:
结构体
循环结构
条件判断