Attack oj
程序员文章站
2022-05-14 16:25:47
...
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。
Author
【2016级《程序设计基础(B)II》期末上机考试-第二场】MLE_kenan
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
struct node
{
int at;
int mi;
int a[5];
}s[110];
void sort(int top,int water[])
{
int i , j ,t;
for(i = 0;i<top-1;i++)
{
for(j = 0;j<top-i-1;j++)
{
if(water[j]>water[j+1])
{
t = water[j];
water[j] = water[j+1];
water[j+1] = t;
}
}
}
}
int main()
{
int n,i,m,j,k,water[1000];
scanf("%d",&n);
for(i = 1;i <= n;i++)
{
scanf("%d",&m);
for(j = 1;j <= m;j++)
{
scanf("%d%d",&s[j].at,&s[j].mi);
for(k = 1;k <= s[j].mi;k++)
{
scanf("%d",&s[j].a[k]);
}
}
int hp=100,num=0,top=0,flag = 0;
for(j = 1;j <= m;j++)
{
while(hp<=s[j].at&&top!=0)
{
hp+=water[top-1];
top--;
num++;
}
if(hp<=s[j].at)
{
flag = 1;
break;
}
hp-=s[j].at;
for(k = 1;k<=s[j].mi;k++)
{
water[top] = s[j].a[k];
top++;
}
sort(top,water);
}
printf("Case #%d: ",i);
if(flag)
printf("QAQ\n");
else
printf("%d\n",num);
}
return 0;
}
上一篇: 单身的人是真的快乐
下一篇: JavaScript 防抖 && 节流
推荐阅读