防御力(蓝桥杯国赛)

题目描述

小明最近在玩一款游戏。对游戏中的防御力很感兴趣。

我们认为直接影响防御的参数为"防御性能",记作 dd ,而面板上有两个防御值 A 和 B ,与 d 成对数关系,A=2^d,B=3^dA=2d,B=3d(注意任何时候上式都成立)。

在游戏过程中,可能有一些道具把防御值 A增加一个值,有另一些道具把防御值 B 增加一个值。

现在小明身上有 n1​ 个道具增加 A 的值和 n2​ 个道具增加 B 的值,增加量已知。

现在已知第 i 次使用的道具是增加 A 还是增加 B 的值,但具体使用那个道具是不确定的,请找到一个字典序最小的使用道具的方式,使得最终的防御性能最大。

初始时防御性能为 0,即 d=0,所以A=B=1。

输入描述

输入的第一行包含两个数 n1,n2,空格分隔。

第二行 n1 个数,表示增加 A 值的那些道具的增加量。

第三行 n2 个数,表示增加 B 值的那些道具的增加量。

第四行一个长度为 n1+n2 的字符串,由 0 和 1 组成,表示道具的使用顺序。0 表示使用增加 A 值的道具,1 表示使用增加 B 值的道具。输入数据保证恰好有 n1 个 0,n2 个 1 。

其中,字符串长度 ≤2×106,输入的每个增加值不超过 2^30。

输出描述

对于每组数据,输出n1​+n2​+1 行。

前 n1​+n2​ 行按顺序输出道具的使用情况,若使用增加A 值的道具,输出 Ax,x 为道具在该类道具中的编号(从 1 开始)。若使用增加 B 值的道具则输出 Bx。

最后一行输出一个大写字母 E 。

输入输出样例

示例

输入

1 2
4
2 8
101

输出

B2
A1
B1
E

 

说实话这题我觉得挺难的,连题目都要看很多遍才能懂,不过毕竟是蓝桥杯国赛的题。

当连续使用道具A或者连续使用道具B时,比如连续使用道具A公式是log2​(1+A1+A2+⋯),它的d其实是不变的。当A和B交替使用时d才会不同。这里用数学公式证明的话相当的复杂,我个人认为较快的方法是用具体的数带进去进行估算。然后我们得出当A排序由小到大,B排序由大到小这样得出的d是最大的。

import java.util.*;
public class Main {
	static void sortA(int a[]) { //对数组A进行排序找出最小
		int temp=Integer.MAX_VALUE;
		int id=0;
		for(int i=0;itemp) {
				id=i;
				temp=b[i];
		}
		b[id]=Integer.MIN_VALUE;
		id++;
		System.out.println("B"+id);
	}
	
	public static void main(String[] args) {
     Scanner in=new Scanner(System.in);
	 int n1=in.nextInt();
	 int n2=in.nextInt();
	 int []A=new int [n1];
	 int []B=new int [n2];
	 for(int i=0;i

你可能感兴趣的:(蓝桥杯,蓝桥杯,java)