美团2021校招笔试-编程题(通用编程试题,第10场)
//对数据进行排序,排完了按需要的数量输出就行了
import java.util.*;
public class Main {
public static void main(String[] args){
Scanner scanner=new Scanner(System.in);
String[] s = scanner.nextLine().split(" ");
int n = Integer.parseInt(s[0]);
int x=Integer.parseInt(s[1]);
int y=Integer.parseInt(s[2]);
int[] arr = new int[n];
s=scanner.nextLine().split(" ");
for(int i=0;i<n;i++){
arr[i]=Integer.parseInt(s[i]);
}
Arrays.sort(arr);
//范围
if( n<2*x || n>2*y){
System.out.println(-1);
return;
}
//二分淘汰人数
int left = x;
int right = y+1;//淘汰的人数在[x,y]之间
while(left < right){
int mid = left+(right-left)/2;
if(n-mid >=x || n-mid <=y){//晋级的人数也要在[x,y]之间
right =mid;
}else{
left =mid+1;
}
}
System.out.println(arr[left-1]);
}
}
import java.util.*;
public class Main {
public static void main(String[] args){
Scanner sc = new Scanner(System.in);
int n = sc.nextInt();
int[] nums = new int[n];
int res = 0;
for(int i = 0;i < n;i++)
nums[i] = sc.nextInt();
Arrays.sort(nums);
for(int i = 0;i < n;i++){
res += Math.abs(i + 1 - nums[i]);
}
System.out.println(res);
}
}
import java.util.*;
public class Main{
static int[][][] dp;
static int[] arr;
public static void main(String[] args){
Scanner sc = new Scanner(System.in);
int n = sc.nextInt();
arr = new int[n+1];
for(int i=1; i<=n ;i++){
arr[i] = sc.nextInt();
}
//dp-1;
dp = new int[n+1][n+1][n+1];
//dp[i][j][k]表示以k为根节点,i~j为子树节点的树的最小开销
int res = dfs(1, n, 0);
System.out.println(res);
}
public static int dfs(int left, int right, int root){
if(left > right){
return 0;
}
if(dp[left][right][root] != 0) return dp[left][right][root];
int res = Integer.MAX_VALUE;
for(int i=left; i<=right; i++){//从节点1到n轮流当根节点
int l = dfs(left, i-1, i);
int r = dfs(i+1, right, i);
res = Math.min(res, l+r+arr[i]*arr[root]);
}
return dp[left][right][root] = res;
}
}