P2006 赵神牛的游戏
赵神牛的游戏
题目描述
在 DNF 中,赵神牛有一个缔造者,他一共有 \(k\) 点法力值,一共有 \(m\) 个技能,每个技能耗费的法力值为 \(a_i\),可以造成的伤害为 \(b_i\),而 boss 的体力值为 \(n\),请你求出它放哪个技能,才可以打死 boss。
当然,赵神牛技术很菜,他一局只放一个技能,不过每个技能都可以放无数次。
输入格式
第一行有三个整数,分别表示 \(k,m,n\)。
后面 \(m\) 行,每行两个整数,第 \((i + 1)\) 行的整数表示耗费的法力值 \(a_i\) 和造成的伤害 \(b_i\)。
输出格式
输出仅一行,既可以杀死 boss 的技能序号,如果有多个,按从小到大的顺序输出,中间用一个空格隔开;如果没有技能能杀死 boss,输出 -1
。
样例 #1
样例输入 #1
100 3 5000
20 1000
90 1
110 10000
样例输出 #1
1
样例 #2
样例输入 #2
50 4 10
60 100
70 1000
80 1000
90 0
样例输出 #2
-1
提示
数据规模与约定
对于全部的测试点,满足:
- \(0\le n,m,k\le 3\times 10^4\),
- \(0 \leq a_i,b_i\le 2147483647\)。
我的代码
遇到了错误
Runtime Error.
Received signal 8: Floating-point exception.
为何呢?因为出现了除数为0的情况,这里的skills[i].a == 0是有可能的
解决: if (skills[i].a == 0 || (k / skills[i].a) * skills[i].b >= n)
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
typedef struct skill
{
int a;
int b;
} Skill;
int main()
{
int k, m, n, num = 0;
scanf("%d %d %d", &k, &m, &n);
Skill *skills = (Skill *)malloc(m * sizeof(Skill));
int *count = (int *)malloc(m * sizeof(int));
if (skills == NULL)
{
printf("内存申请失败");
return 1;
}
memset(skills, 0, m * sizeof(Skill));
for (int i = 0; i < m; i++)
{
scanf("%d %d", &skills[i].a, &skills[i].b);
if (skills[i].a == 0 || (k / skills[i].a) * skills[i].b >= n)
{
count[num] = i + 1;
num++;
}
}
if (num == 0)
printf("-1");
else
{
for (int i = 0; i < num; i++)
printf("%d ", count[i]);
}
return 0;
}