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;
    }
}

上一篇:【其它】普通话里有哪些音只有一个字?


下一篇:汉语-词语-穷蹙:百科