首页 > 编程学习 > P2006 赵神牛的游戏

P2006 赵神牛的游戏

发布时间:2022/8/25 19:09:09

题目描述

在 DNF 中,赵神牛有一个缔造者,他一共有 kk 点法力值,一共有 mm 个技能,每个技能耗费的法力值为 a_iai,可以造成的伤害为 b_ibi,而 boss 的体力值为 nn,请你求出它放哪个技能,才可以打死 boss。

当然,赵神牛技术很菜,他一局只放一个技能,不过每个技能都可以放无数次。

输入格式

第一行有三个整数,分别表示 k,m,nk,m,n。

后面 mm 行,每行两个整数,第 (i + 1)(i+1) 行的整数表示耗费的法力值 a_iai 和造成的伤害 b_ibi

输出格式

输出仅一行,既可以杀死 boss 的技能序号,如果有多个,按从小到大的顺序输出,中间用一个空格隔开;如果没有技能能杀死 boss,输出 -1

输入输出样例

输入 #1
100 3 5000
20 1000
90 1
110 10000
输出 #1
1
输入 #2
50 4 10
60 100
70 1000
80 1000
90 0
输出 #2
-1

说明/提示

数据规模与约定

对于全部的测试点,满足:

  • 0\le n,m,k\le 3\times 10^40n,m,k3×104,
  • 0 \leq a_i,b_i\le 21474836470ai,bi2147483647。

思路:

  一定要认真审题!!!
  我一直以为他只需要输出第一个可以击败boss的技能序号就可以了,交了半天代码只能拿10分我还疑惑呢,反复检查没检查出问题在哪,最后看了看输出格式才发现:

    “我焯原来每个都要输出啊!!!”

  因为这题的题目描述最后一句话说的是:“他一局只放一个技能,不过每个技能都可以放无数次。”

  这句话误导人,我以为只要输出一个技能就行了

接下来是代码思路

  首先我们需要知道,技能使用次数=法力值/法力消耗,总伤害=使用次数*伤害,如果总伤害≥boss的体力值,那么这个技能就可以击败boss,输出他的序号加一个空格

  但是这题不仅仅是表面上的难度,单论这一题的代码是很容易写出来的,但是这题需要考虑法耗、法伤为0的情况,如果法耗为零那么技能使用次数是没法求出来的会报错,所以要在判断语句里面加一个条件:法耗为0并且伤害>0,这样肯定是能击败boss的;另一个条件是:法耗不为零并且伤害*使用次数>boss体力值,两个条件用“或”连接即可,其他的不多说,没啥好讲,上代码(洛谷可以AC,放心食用)

代码:

 1 #include<iostream>
 2 using namespace std;
 3 //创结构体是因为不想创俩数组,比较方便
 4 struct a_b{
 5     int loss,harm;
 6 }j[30001];
 7 int main(){
 8     //法术值,技能数,boss体力值
 9     int k,m,n;
10     //flag判断是否找到可以击败boss的技能,初始化为false
11     bool flag=false;
12     cin>>k>>m>>n;//输入,后面的不讲了
13     //因为是技能序号所以循环从1开始
14     for(int i=1;i<=m;i++){//输入每个技能的法力损耗和伤害同时进行判断能否击败boss
15         cin>>j[i].loss>>j[i].harm;
16         //如果法术损耗为0且伤害>0就可以击败boss
17         //或者法术损耗不为0并且伤害*使用次数>体力值即可击败boss
18         if((j[i].loss ==0 && j[i].harm>0)||( j[i].loss && (k/j[i].loss) *j[i].harm>=n)){
19             //找到了可以击败boss的技能,flag改为true
20             flag=true;
21             //输出当前序号
22             cout<<i<<" ";
23         }
24     }
25     //如果循环完了flag还是false说明一个可以用的技能都没有,输出-1
26     if(!flag)cout<<-1;
27     return 0;
28 }
29 //可能会和别人代码重复,因为我也没想到这题还能怎么写

 

Copyright © 2010-2022 mfbz.cn 版权所有 |关于我们| 联系方式|豫ICP备15888888号