自学内容网 自学内容网

CF 230A.Dragons(Java实现)

题目分析

        (桐老爷,泪目)题目讲很多字,其实就是打怪升级,初始战斗力>龙的战斗力就能击败龙并炼化经验增加战斗力,然后打下一条龙,如果打不过了就寄

思路分析

        首先我还是想到键值对,分别存储龙的战斗力和给的经验,一个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);
}
}

        感谢您能够看到这里,一起见证小何同学的算法学习,如果您有不同的见解,希望能得到您的指点和点悟;如果您是和我一样的同学,也希望这篇文章能对您有所帮助。


原文地址:https://blog.csdn.net/Dr_Si/article/details/145169016

免责声明:本站文章内容转载自网络资源,如本站内容侵犯了原著者的合法权益,可联系本站删除。更多内容请关注自学内容网(zxcms.com)!