题目描述
在 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
。
输入输出样例
输入 #1100 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^40≤n,m,k≤3×104,
- 0 \leq a_i,b_i\le 21474836470≤ai,bi≤2147483647。
思路:
一定要认真审题!!!
我一直以为他只需要输出第一个可以击败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 //可能会和别人代码重复,因为我也没想到这题还能怎么写
标签:输出,赵神,P2006,loss,boss,游戏,体力值,伤害,技能 From: https://www.cnblogs.com/Ghost1GM/p/16625409.html