混战世界
题目描述
战乱年代,整个世界各个军阀的兵团混战,你是某军团的战略参谋,你手下有n(保证为3的倍数)个士兵,第i个士兵的物理攻击数值为Ai,魔法攻击数值为Bi,你需要将这些士兵三等分为三个连,第一个连需要去物理空间参加物理对抗战争,战斗力估值W1为士兵的物理攻击数值之和;第二个连需要去魔法空间参加对抗战争,战斗力估值W2为士兵的魔法攻击数值之和;第三个连需要去虚幻空间参加物理魔法兼备的综合对抗战争,战斗力估值W3为所有士兵的物理攻击数值、魔法攻击数值之和除以2。你希望W1+W2+W3最大,这样才最有可能胜利。
输入描述
第一行一个整数n,保证为3的倍数。(3<=n<=100000)
第二行n个整数,第i个数表示Ai
第三行n个整数,第i个数表示Bi(1<=Ai,Bi<=1000)
输出描述
一个小数,表示最大数值和,保留俩位小数(四舍五入)
输入样例
6
1 7 3 4 5 9
2 3 9 4 3 3
输出样例
35.00
package Test;
import java.text.DecimalFormat;
import java.util.Arrays;
import java.util.Scanner;
public class test {
public static void main(String[] args) {
Scanner s=new Scanner (System.in);
int n=s.nextInt();
if(n%3!=0) {
System.out.println("请重新输入");
return ;
}
int a1[] =new int[n]; //a1存储物理攻击值
int a2[] =new int[n]; //a2存储魔法攻击值
for(int i=0;i<n;i++) {
a1[i] =s.nextInt();
}
for(int i=0;i<n;i++) {
a2[i] =s.nextInt();
}
solution(n,a1,a2);
}
public static void solution (int n,int a1[],int a2[]) {
int a3[] =new int [n];
for(int i=0;i<n;i++ ) {
a3[i] =a1[i] -a2[i];
}
Arrays.sort(a3); //从小到大排序
int n1 =n/3;
int w1=0;
int w2=0;
int w3=0;
for(int i =0;i<n1;i++) {
for(int j =0;j<n;j++) {
if(a1[j]-a2[j]==a3[i]) {
w2 =w2+a2[j];
}
}
}
for(int i =n1;i<2*n1;i++) {
for(int j =0;j<n;j++) {
if(a1[j]-a2[j]==a3[i]) {
w3 =w3+(a1[j]+a2[j])/2;
}
}
}
for(int i =2*n1;i<3*n1;i++) {
for(int j =0;j<n;j++) {
if(a1[j]-a2[j]==a3[i]) {
w1 =w1+a1[j];
}
}
}
int w=w1+w2+w3;
DecimalFormat df =new DecimalFormat ("#.00");
System.out.println(df.format(w));
}
}
解题思路:
因为要保证n为3的倍数,所以在输入的时候要对n进行判断,a1,a2,a3 数组分别存储物理攻击值、魔法攻击值、和物理-魔法的值,对a3数组进行排序,值越大说明物理值越大,放到一连;值越小说明魔法值越大,放到二连;剩下的放到三连,这样使得一二三连总和攻击值最大。最后循环a3数组,找到在a1,a2中的索引,进行计算