题目分析
(桐老爷,泪目)题目讲很多字,其实就是打怪升级,初始战斗力>龙的战斗力就能击败龙并炼化经验增加战斗力,然后打下一条龙,如果打不过了就寄
思路分析
首先我还是想到键值对,分别存储龙的战斗力和给的经验,一个n条龙,然后循环判断战斗力胜负,如果胜则+战斗力,并挑战下一条,负则结束战斗。但是这里忽略了一个点,题目说的是不限顺序所以需要从小到大的战斗力依次去挑战,因此我在外面套了一个list,用sort函数从小到大依次排列;其次示例中会出现重复的战斗力,因此字典的方式会重复键,导致部分存值失败,我一开始想的是在值里套入list去储存多个值,但是想到同一个战斗力的龙直接一起挑战,即值=旧值+新值,所以我用merge函数直接在存储的时候更新省了不少麻烦
代码
import java.util.*;
public class Main {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
int s=sc.nextInt();//初始战斗力
int n=sc.nextInt();//总共龙的个数
sc.nextLine();
HashMap<Integer,Integer> map=new HashMap<>();//龙的战斗力和经验对应
String re="YES";//初始化答案
for (int i=0;i<n;i++){
map.merge(sc.nextInt(), sc.nextInt(),Integer::sum);//存入map,三个参数分别代表,键,初始化值,更新值求和
sc.nextLine();//吞回车
}
ArrayList<Map.Entry<Integer,Integer>> list=new ArrayList<>(map.entrySet());//套list
list.sort((entry1,entry2)-> entry1.getKey()-entry2.getKey());//list的排序,里面用lambda函数表示从小到大
for (int i=0;i<list.size();i++){//遍历list,此时需要注意不能用n,一旦有键相同的值就会溢出
if (s>list.get(i).getKey()){//战斗力获胜
s+= list.get(i).getValue();//加战斗力
}else {
re="NO";//失败就结束
break;
}
}
System.out.println(re);
}
}
感谢您能够看到这里,一起见证小何同学的算法学习,如果您有不同的见解,希望能得到您的指点和点悟;如果您是和我一样的同学,也希望这篇文章能对您有所帮助。