1. 程式人生 > 實用技巧 >美團2021後端開發崗位筆試 壓軸題

美團2021後端開發崗位筆試 壓軸題

美團2021後端開發崗位筆試 壓軸題

某公司需要抽調一批人組建 A B 兩隻隊伍,去參加一項比賽,兩隻隊伍的人數人別是x 和 y ,

給定 x + y 個整數,代表這 批人的技術水平,賽事租會根據計算該公司的實力水平,該公司的實力水平等於兩隻隊伍的平均水平之和,而每隻隊伍的平均水平等於該隊伍的所有人的水平之和除以該隊伍的人數,現在需要你進行分配,這 x + y 個人,哪些人去A組,哪些人去B組,可以使得該公司的評分最高,

例如: x = 4, y = 1

員工的水平分別為: 1 2 3 4 5

則應該讓 最後一名員工去B組,前4 個員工去A組,這樣(1+2+3 + 4) / 4 + 5 = 7.5 總評分最高,

所有應該輸出 AAAAB

輸入:

4 1

1 2 3 4 5

輸出:

AAAAB

import java.util.*;

public class demo01 {
private static int x;
private static int y;
public static void main(String[] args) {
Scanner scan = new Scanner(System.in);
x = scan.nextInt();
y = scan.nextInt();

int[] arr = new int[x + y];
for(int i=0;i<x+y;i++){
arr[i] = scan.nextInt();
}
scan.close();

boolean[] tag = new boolean[x+ y];

ArrayList<ArrayList<Integer>> res = new ArrayList<>();
Deque<Integer> path = new ArrayDeque<>();
getAllThePossible(arr,tag,res,path);
double[] sources = new double[res.size()];

for(int k=0;k<res.size();k++ ){
ArrayList<Integer> list1 = res.get(k);
boolean[] flag = new boolean[x + y];
for(int i : list1){
flag[i-1] = true;
}
double sumA = 0,sumB = 0;
for(int i= 0;i<x+y;i++){
if(flag[i]){
sumA += arr[i];
}else{
sumB += arr[i];
}
}
double source = sumA / x + sumB / y ;
sources[k] = source;
}
double max = 0;
int index = 0;
for(int i=0;i<sources.length;i++){
if(sources[i] > max ){
max = sources[i];
index = i;
}
}
ArrayList<Integer> last = res.get(index);
StringBuilder sb = new StringBuilder();
for(int i=0;i<x+y;i++){
if(last.contains(i+1)){
sb.append("A");
}else{
sb.append("B");
}
}
String a = sb.toString();
System.out.println( a);
}

public static void getAllThePossible( int[] arr,boolean[] tag,ArrayList<ArrayList<Integer>> res, Deque<Integer> path){
if(path.size() == x ){
ArrayList<Integer> temp = new ArrayList<>(path);
Collections.sort(temp);
if(!res.contains(temp)){
res.add(temp);
}
return;
}
for(int i=0;i<x+y;i++){
if(tag[i]) continue;
path.add(arr[i]);
tag[i] = true;
getAllThePossible(arr,tag,res,path);
tag[i] = false;
path.removeLast();
}
}
}

總結:

這道題的難點在於邏輯比較複雜,有點混亂,但核心還是回溯演算法,把所有的情況羅列出來,因為這x + y 個人要麼屬於 A隊伍,要麼屬於B 隊伍,所以我們只需要從x + y 個人中抽取 x 個人作為A隊的,剩下的人就是B隊的了,把所有的情況都羅列出來,然後逐個比較計算就可以了,

這種問題的核心在於全排列,核心演算法是回溯演算法。