zoukankan      html  css  js  c++  java
  • Java实现 蓝桥杯 算法提高 进攻策略加强(暴力)

    试题 算法提高 进攻策略加强

    问题描述
      植物大战僵尸这款游戏中,还有一个特别的玩儿法:玩家操纵僵尸进攻植物。
      首先,僵尸有m种(每种僵尸都是无限多的),玩家可以选择合适的僵尸来进攻。使用第i种僵尸需要花费Wi资源,可以得到Pi的攻击效果。在这里,我们认为多个僵尸总的攻击效果就是他们每个攻击效果的代数和。
      地图共有n行,对于第i行,最左端有若干植物,这些植物需要至少Qi的攻击才能被全部消灭。若一行上的植物全部被消灭,我们称这一行被攻破。
      由于资源紧张,你只有总量为K的资源,不一定能够攻破所有行。但统治者希望攻破相邻的T行,并希望T尽量的大。你能帮他算出T的值吗?
    输入格式
      第一行三个非负整数:m、n、K;
      第二行m个正整数,第i个数表示Wi;
      第三行m个正整数,第i个数表示Pi;
      第四行n个非负整数,第i个数表示Qi。
    输出格式
      3 11 39
      5 2 11
      3 1 7
      5 3 6 10 3 2 4 200 1 1 1
    样例输入
    一个满足题目要求的输入范例。
    例:
    2 2
    1 2
    3 4
    样例输出
    4
    数据规模和约定
      对于70%的数据:n<=1000

    对于100%的数据:n<=200000,m<=100,K<=1000000,所有Pi、Qi<=100000000

    PS:
    感觉这个题没描述清除,很烦
    这个题应该可以算暴力,因为我是暴力过去的,把每一种可能都循环一遍
    后面通过map记录一下,减少循环,类似于剪枝的操作吧

    package 蓝桥杯官网;
    
    import java.util.HashMap;
    import java.util.Map;
    import java.util.Scanner;
    
    public class 进攻策略加强 {
        public static void main(String[] args) {
            Scanner s = new Scanner(System.in);
            int m = s.nextInt();
            int n = s.nextInt();
            int k = s.nextInt();
            int []wi = new int[m];
            int []pi = new int[m];
            for (int i = 0; i < pi.length; i++) {
                wi[i] = s.nextInt();
            }
            for (int i = 0; i < pi.length; i++) {
                pi[i] = s.nextInt();
            }
            int []qi = new int[n];
            for (int i = 0; i < qi.length; i++) {
                qi[i] = s.nextInt();
            }
            int T = 0;
            for (int i = n-1; i >=0; i--) {
                for (int j = 0; j+i>=i&&j+i < n; j++) {
                    int a = k;
                    int count = 0;
                    for (int z = j; z <=j+i; z++) {
                        int x = getPrefferred(wi,pi,qi,z);
                        if(a>=x)
                        {
                            count++;
                            a-=x;
                        }else
                        {
                            break;
                        }
                    }
                    if(count>T)
                    {
                        T = count;
                        if(T>=i+1)
                        {
                            System.out.println(T);
                            return;
                        }
                    }
                }
            }
            System.out.println(T);
        }
        static Map<Integer,Integer> map = new HashMap<Integer,Integer>();
        public static int getPrefferred(int []wi,int []pi,int []qi,int index)
        {
            Integer dp = map.get(qi[index]);
            if(dp!=null) return dp;
            int price = Integer.MAX_VALUE;
            int minIndex = 0;
            for (int i = 0; i < wi.length; i++) {
                int pc =(int)( Math.ceil(qi[index]*1.0/pi[i])*wi[i]);
                if(pc<price)
                {
                    price = pc;
                    minIndex = i;
                }
            }
            map.put(qi[index], price);
            return price;
        }
    }
    
    
  • 相关阅读:
    vue项目index.html , main.js的关系
    vue项目是如何加载入口文件main.js的
    解决Mysql密码修改后不能登录的问题
    解决IDEA右侧maven不显示方法
    (转)sql语句定义和执行顺序
    关于我
    css中好用的clamp()函数
    vue中子组件使用$emit传值的种种情况
    我的大学 -詹书庭
    自定义组件使用v-model
  • 原文地址:https://www.cnblogs.com/a1439775520/p/13074595.html
Copyright © 2011-2022 走看看