P2006 赵神牛的游戏

发布时间 2023-07-28 02:47:59作者: DawnTraveler

赵神牛的游戏

题目描述

在 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;
}