滴滴笔试,大佬们看看我哪里又问题吗
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; } }