混戰世界
題目描述
戰亂年代,整個世界各個軍閥的兵團混戰,你是某軍團的戰略參謀,你手下有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中的索引,進行計算