百度2019秋招笔试真题----------混战世界

在战乱年代,如何将士兵分为三连,分别应对物理、魔法和综合对抗,以实现最大战斗力?本文介绍一种算法,通过计算物理攻击与魔法攻击的差值,优化兵力分配,达到总战斗力最大化。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

混战世界

题目描述

战乱年代,整个世界各个军阀的兵团混战,你是某军团的战略参谋,你手下有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中的索引,进行计算

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值