hash方法的进阶
题目:https://ac.nowcoder.com/acm/contest/8564/A
import java.util.*; public class Main { public static void main(String[] args) { Map<Integer, Integer> map = new HashMap<Integer, Integer>(); Scanner sc = new Scanner(System.in); int n = sc.nextInt(); int m = sc.nextInt(); int AllVal = 0; int max = 0; int a[] = new int[n]; int dis[] = new int[m]; int val[] = new int[m]; for (int i = 0; i < n; i++) { a[i] = sc.nextInt(); } for (int i = 0; i < m; i++) { dis[i] = sc.nextInt(); } for (int i = 0; i < m; i++) { val[i] = sc.nextInt(); if(map.get(dis[i])!=null) map.put(dis[i], Math.max(map.get(dis[i]), val[i])); else map.put(dis[i], val[i]); } Arrays.sort(dis); Arrays.sort(a); int j; int k = 0; for (int i = 0; i<n ; i++) { for ( j = k; j < m; j++) { if(a[i]>dis[j]){ max = Math.max(max, map.get(dis[j])); } else { break; } } k = j; AllVal += max; } System.out.println(AllVal); } }
首先,自己的思路是利用枚举法,但是,借鉴了别人的代码之后发现了自己的许多问题,比如说,利用枚举法的时候,自己的方***忽略题目条件,就是一个战斗机只能攻击一次,所以我们要挑最大价值的基地攻击,但是自己的方***吧所有能攻击的基地的价值都加上,所以错得很离谱。借鉴别人的代码之后呢,就清晰明了了,大佬利用的是hashmap,先把价值与基地一起绑定,那么在绑定的时候避免不了有相同防御力的基地,但是别的价值更大,那就可以只改变基地的价值(这是hash表可以轻松)
if(map.get(dis[i])!=null) map.put(dis[i], Math.max(map.get(dis[i]), val[i])); else map.put(dis[i], val[i]);
这里就是判断如果如果这一个基地不为空,他已经存在了价值,那么就选出两个价值中最高的一个,存入到这个基地中,也就是说只取这个基地价值最大化,就能保证我们得到的价值最大化。
for (int i = 0; i<n ; i++) { for ( j = k; j < m; j++) { if(a[i]>dis[j]){ max = Math.max(max, map.get(dis[j])); } else { break; } } k = j; AllVal += max; }
最后再上面循环的时候,利用max模拟价值的最大化,因为我们已经排序好了两个数列。一直拿战斗机和基地防御力pk,一直用当前的最大价值max和这个基地的最大价值对比,将最大者继续赋值给max。当if条件不成立的时候也就是战斗机打不过的时候,我们就可以结束循环,得到最大max。
这里说一下(为什么不是int j = 0),应该是减少算法复杂度吧,虽然我不知道算这个东西啊哈哈哈哈哈,