说实话,一开始看到这个题,还以为是动态规划,后来想了一下好像并不存在什么子问题,就是单纯要求个最大值而已,枪的威力由强本身的威力加上配件的加成,那么配件加成就显得尤为重要,我在代码中有一步处理,对于同种的配件,如果一个加成比另一个的大,那就用大的覆盖掉小的,小的根本就不用管了
import java.util.Scanner;
class gun {
public int p;//枪支威力
public int k;//枪支可装配的配件数量
public int[] kind = new int[1002];//可装配配件的种类
}
public class Main {
static gun[] g = new gun[1002];//声明对象数组
public static Double[] pei = new Double[1002];
public static void main(String[] args) {
int n,m;
Scanner cin = new Scanner(System.in);
while(cin.hasNext()) {
n = cin.nextInt();
m = cin.nextInt();
//实例化对象数组,不然不能用
for(int i = 0;i < 1002;i++) {
g[i] = new gun();
}
for(int i = 0;i < 1002;i++)
pei[i] = 0.0;
//输入枪的信息
for(int i = 0;i < n;i++) {
g[i].p = cin.nextInt();
g[i].k = cin.nextInt();
for(int j = 0;j < g[i].k;j++)
g[i].kind[j] = cin.nextInt();
}
//输入配件的信息
for(int i = 0;i < m;i++) {
int q = cin.nextInt();
Double b = cin.nextDouble();
if(pei[q] < b)
pei[q] = b;
}
//计算最大威力
Double max = 0.0;
for(int i = 0;i < n;i++) {
Double tmp = 1.0;
for(int j = 0;j < g[i].k;j++)
tmp += pei[g[i].kind[j]];
if(g[i].p * tmp > max)
max = g[i].p * tmp;
}
System.out.printf("%.4f\n",max);
}
}
}
这里定义的对象数组类似于c/c++中的结构体,将枪的信息包装起来,一开始无论怎么运行都会报错,查了原因才发现我没有18~20行的实例化对象数组,因为这个东西我用的也少,所以没有注意到,为了确保计算的精准,我用的都是double的包装类,基本浮点数据类型是无法保存一个确定的浮点数的,只能近似,但是用Double包装类就可以