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),应该是减少算法复杂度吧,虽然我不知道算这个东西啊哈哈哈哈哈,

全部评论

相关推荐

04-11 21:31
四川大学 Java
野猪不是猪🐗:(ja)va学弟这招太狠了
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客企业服务