ICode9

精准搜索请尝试: 精确搜索
首页 > 编程语言> 文章详细

Java实现 蓝桥杯 算法提高 进攻策略加强(暴力)

2020-04-30 12:42:27  阅读:340  来源: 互联网

标签:Java nextInt int wi 蓝桥 ++ 算法 qi pi


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

问题描述
  植物大战僵尸这款游戏中,还有一个特别的玩儿法:玩家操纵僵尸进攻植物。
  首先,僵尸有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;
    }
}

标签:Java,nextInt,int,wi,蓝桥,++,算法,qi,pi
来源: https://blog.csdn.net/a1439775520/article/details/105836787

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有