2019届百度秋招笔试题第一题_混战世界

知识共享许可协议 版权声明:署名,允许他人基于本文进行创作,且必须基于与原先许可协议相同的许可协议分发本文 (Creative Commons

1.题目描述

 战乱年代。整个世界各个军阀的英团泄战,你是P7军团的战略参谋,你手下n(保证为3的倍数)个士兵,第i个土兵的物理攻击数值为Ai,魔法攻击数值为Bi,你需要将这些士兵三等分为三个连,

  • 第一个连需要去物理空间参加物理对抗战争,战斗力估值W1为士兵的物理攻击数值之和:
  • 第二个连需要去魔法空间参加魔法对抗战争,战斗力估值W2为士兵的魔法攻击数值之和:
  • 第三个连需要去虚幻空间参加物理魔法装备的综合对抗战争,战斗力估值W3为所有士兵的物理攻击数值、魔法攻击数值之和除以2。

你希望W1+W2+W3最大。这样才最有可能胜利。
输入描述:
 第一行一个整数n,保证为3的倍数。(3≤n≤1000)
  第二行n个整数, 第i个数表示Ai。
  第三行n个整数,第i个数表示Bi。(I≤Ai, Di≤1000)
输出描述:
 一个小数,表示最大数之和,保留两位小数(四舍五入)。
输入样例:
 6
 1 7 3 4 5 9
 2 3 9 4 3 3
输出样例:
 35.00

2.解题思路

设一个人的物理值为A,魔法值为B.
派去一连可得A的贡献,二连可得B, 三连可得(A+B)/2。

  • 去一连与去三连相比差了(A-B)/2.去二连比去三连也差(A-B)/2。这样,可以根据每个人的A-B数值进行排序,
  • 由题意可知,A越大越适合去1连,B越大越适合去2连,故(A-B)/2中,较大者1连,较小者去2连,中间的去3连。

3.代码

import java.text.DecimalFormat;
import java.util.Arrays;
public class Main {
    public static void main(String[] args) {
//        int a[] = {1,7,3,4,5,9};
//        int b[] = {2,3,9,4,3,3};
//        System.out.println(String.format("%.2f",solution(a,b)));
		Scanner sr = new Scanner(System.in);
		int n = sr.nextInt();
		int a[] = new int[n];
		int b[] = new int[n];
		for(int i = 0;i<n;i++){
		  a[i] = sr.nextInt();
		}
		for(int i = 0;i<n;i++){
		  b[i] = sr.nextInt();
		}
        solution(a,b);
    }
    public static void solution(int A[],int B[]){
        Diff []list= new Diff[A.length];
        for(int i = 0;i<A.length;i++){
            list[i] = new Diff(i,A[i] - B[i]);
        }
        //里面的list已经从小到大排序了
        Arrays.sort(list);
        double res = 0;
        //取值,较小的去2连,中间的去三连,较大的去1连
        int Avglen = list.length/3;

        for(int i = 0;i<list.length;i++){
            //(A-B)较小者去2连
            if(0<=i && i<Avglen ){
                res += B[list[i].index];
                //(A-B)中间者去3连
            }else if(i >= Avglen && i< 2 *Avglen ){
                res += (A[list[i].index] + B[list[i].index])/2;
            }else{
                //(A-B)较大者去1连
                res += A[list[i].index];
            }
        }
        DecimalFormat df = new DecimalFormat("#.00");
        System.out.println(df.format(res));

    }
    //用于存储索引坐标以及(Ai-Bi)
    static class Diff implements Comparable{
        int index;
        int value;
        public Diff(int index, int value) {
            this.index = index;
            this.value = value;
        }
        public int getIndex() {
            return index;
        }
        //按照(A-B)/2 进行排序
        @Override
        public int compareTo(Object o) {
          Diff diff = (Diff) o;
          if(this.value > diff.value)
              return 1;
          else if(this.value == diff.value)
              return 0;
          else
              return -1;
        }
    }
}
拓展

java里面保留数值的位数(四舍五人)
方法1:
   System.out.println(String.format("%.2f",num));
方法2:
   DecimalFormat df = new DecimalFormat("#.00");
   System.out.println(df.format(num));

猜你喜欢

转载自blog.csdn.net/qq_17556191/article/details/95065552