滴滴笔试,大佬们看看我哪里又问题吗
1. 桃子装箱
n个桃子,每个重ai,尽可能多的装入一个箱子,要求箱子内最终的桃子重量不能超过平均重量的k倍,问最多能装多少个桃子?
输入:
第一行n和k。
第二行n个数,对应每个桃子的重量。
输出:最多能装的数量
例子:
输入:
5 2
3 10 5 4 2
输出:
#滴滴笔试##滴滴23秋招笔试有点儿难啊#
n个桃子,每个重ai,尽可能多的装入一个箱子,要求箱子内最终的桃子重量不能超过平均重量的k倍,问最多能装多少个桃子?
输入:
第一行n和k。
第二行n个数,对应每个桃子的重量。
输出:最多能装的数量
例子:
输入:
5 2
3 10 5 4 2
输出:
4
package writeexam.didi0904;
import java.util.*;
/**
* 输入描述:
* 输入数据有多组, 每行表示一组输入数据。
* 每行不定有n个整数,空格隔开。(1 <= n <= 100)。
*
* next()不会获取字符前/后的空格/Tab键,只获取字符。
* 开始获取字符(字符前后不算)直到遇到空格/Tab键/回车截止获取;nextLine()会获取字符前后的空格/Tab键,遇到回车键截止。
*/
public class Problem01 {
public static ArrayList<ArrayList<Integer>> res = new ArrayList<>();
public static void main(String[] args){
Scanner sc = new Scanner(System.in);
// 1. 输入数据
int n = sc.nextInt();
int k = sc.nextInt();
int[] weights = new int[n];
for(int i = 0; i < n; i ++){
weights[i] = sc.nextInt();
}
// 2. 重复元素,不可重复选, 组合问题
Arrays.sort(weights);
// for(int i = 0; i < n; i ++){
// System.out.print(weights[i] + " ");
// }
// 3. 回溯所有组合情况
ArrayList<Integer> route = new ArrayList<>();
backTrace(weights, 0, route, k);
int maxCount = 0;
for(ArrayList<Integer> e:res){
// System.out.println("route: " + route);
maxCount = Math.max(maxCount, e.size());
}
System.out.println(maxCount);
}
public static void backTrace(int[] weights, int start, ArrayList<Integer> route, int k){
if(route.size() > 0){
if(isValid(route, k)){
// System.out.println("route:" + route);
res.add(new ArrayList<>(route));
}else{
return;
}
}
for(int i = start; i < weights.length; i++){
// if(i > start && weights[i] == weights[i - 1]){
// continue;
// }
route.add(weights[i]); // 做出选择
backTrace(weights, i + 1, route, k);
route.remove(route.size() - 1); // 撤销选择
}
}
public static boolean isValid(ArrayList<Integer> route, int k){
int maxValue = route.get(route.size() - 1);
// System.out.println("maxValue: " + maxValue);
int total = 0;
for(int num : route){
total += num;
}
return (maxValue * 1.0) > ((total / route.size()) * k) ? false : true;
}
}
2. 老张的美术课
对于每个非负整数都有一个美丽值,美丽值定义为这个数十进制下每个数位的异或和,如123的美丽值是1^2^3=0。问对于一个闭区间[L, R]中所有的整数,美丽值恰好为t的数有多少个?
输入:
第一行一个正整数T,代表T个询问
第二行T个非负整数,Li
第三行T个非负整数,Ri
第四行T个非负整数,ti
输出:
每个询问输出一个整数,每个输出用空格隔开
例子:
输入:
2
0 1
0 10
0 1
输出:
1 2
package writeexam.didi0904;
import org.junit.Test;
import java.util.ArrayList;
import java.util.Scanner;
/**
* 输入描述:
* 输入数据有多组, 每行表示一组输入数据。
* 每行不定有n个整数,空格隔开。(1 <= n <= 100)。
*
* next()不会获取字符前/后的空格/Tab键,只获取字符。
* 开始获取字符(字符前后不算)直到遇到空格/Tab键/回车截止获取;nextLine()会获取字符前后的空格/Tab键,遇到回车键截止。
*/
public class Problem02 {
public static void main(String[] args){
Scanner sc = new Scanner(System.in);
int T = sc.nextInt();
int t = T;
ArrayList<Integer> res = new ArrayList<>(); // 保存结果
int[][] arr = new int[T][2];
for(int j = 0; j < T; j++){
arr[j][0] = sc.nextInt();
arr[j][1] = sc.nextInt();
}
// for(int i = 0; i < arr.length; i++){
// System.out.println(arr[i][0] +" "+ arr[i][1]);
// }
int[] arr_t = new int[T];
arr_t[0] = sc.nextInt();
arr_t[1] = sc.nextInt();
for(int s = 0; s < T; s++){
int left = arr[s][0];
int right = arr[s][1];
int len = right - left + 1;
// System.out.println(left + " " + right);
int[] dp = new int[len];
dp[0] = isValid(left, arr_t[s]) ? 1 : 0;
for(int i = 1; i < len; i++){
left++;
if(isValid(left, arr_t[s])){
dp[i] = dp[i - 1] + 1;
}else{
dp[i] = dp[i - 1];
}
}
res.add(dp[len - 1]);
System.out.print(dp[len - 1] + " ");
}
}
public static boolean isValid(int num, int t){
char[] a = String.valueOf(num).toCharArray();
int result = a[0] - 48;
for(int i = 1; i < a.length; i++){
result = result ^ (a[i] - 48);
}
return result == t ? true : false;
}
}

