Attack
Time Limit: 1000MS
Memory Limit: 65536KB
Problem Description
PBH 最近在玩一个游戏。游戏中玩家有 100 的血量,目前有 n 个小怪,小怪会按顺序前来攻击玩家且小怪只会采用 1v1 的方式,玩家每次可秒杀一个小怪,并受到小怪攻击力的伤害(血量减少小怪攻击力的数值),打死小怪会掉落药水。
现在问题来了,打完这 n 个小怪最少需要喝多少瓶药水(喝药水不耗时)?
Input
先输入一个整数 t 表示数据的组数,t 不超过 1000。
对于每组数据,第一行先输入小怪的个数 n (1 <= n <= 100),接下来的 n 行输入小怪攻击力 atki (1 <= atki <= 50) 以及小怪掉落 mi (0 <= mi <= 4) 个药水和药水所能恢复生命的值 ai (1 <= ai <= 30)。
Output
对于每组数据先输出 "Case #x: ",x 表示当前为第几组数据,之后输出打完所有小怪需要的最少药水数。如果无法杀死这 n 个小怪,即某次攻击小怪时已无药水可用且当前血量无法攻击小怪(小怪攻击大于等于当前血量),则输出 ”QAQ”。
所有输出均不包括引号。
Example Input
3 2 50 1 20 49 0 4 50 1 10 40 0 30 3 20 30 20 10 0 3 50 3 20 15 1 45 2 1 1 27 0
Example Output
Case #1: 0 Case #2: QAQ Case #3: 2
Hint
请大家仔细核对 "Case #x: ",建议复制样例输出中的字符串到你的代码,以防敲错导致 Wrong Answer。
#include <stdio.h>
#include <stdlib.h>
struct node
{
int data;
struct node * next;
};
int main()
{
int t,i,j,k,flag,blood,medicine,attack,num,n,maxadd;
struct node * head,* p,*q,*r;
scanf("%d",&t);
for(i=1;i<=t;i++)//t波小怪
{
head=(struct node *)malloc(sizeof(struct node));
head->next=NULL;
blood=100;num=0;//初始化生命100用药量为零
scanf("%d",&n);
for(j=0,flag=1;j<=n-1;j++)//n个小怪来袭
{
scanf("%d %d",&attack,&medicine);
blood=blood-attack;
if(blood<=0&&flag==1)//血量不足嗑药
{
while(1)//循环加血直到用完或复活
{
maxadd=0;
if(head->next!=NULL)
{
maxadd=head->next->data;
head->next=head->next->next;
num++;
}
blood=blood+maxadd;
if(blood>0)//成功复活
{
flag=1;
break;
}
if(blood<=0&&maxadd==0)//死亡
{
flag=0;
break;
}
}
}
for(k=1;k<=medicine;k++)//降序存储药物值
{
p=(struct node *)malloc(sizeof(struct node));
scanf("%d",&p->data);
r=head;
q=head->next;
while(1)
{
if(q==NULL||q->data<=p->data)
{
p->next=q;
r->next=p;
break;
}
if(q->data>p->data)
{
q=q->next;
r=r->next;
}
}
}
}
if(flag)//活到最后输出用药量
{
printf("Case #%d: %d\n",i,num);
}
if(flag==0)//死亡输出QAQ
{
printf("Case #%d: QAQ\n",i);
}
}
return 0;
}