蔚来笔试
1.三个for循环 直接全部过,要注意越界问题,用long
2.递归int f(int now,int target){},这道题要注意越界,用long
public static long f(long now,long target) { if(now>target){return Integer.MAX_VALUE;} if(now==target){return 0;} int l=f(now*a,target); int r=f(now*b,target); int temp=Math.min(l,r); if(temp!=Integer.MAX_VALUE) { return temp+1; } else{ return Integer.MAX_VALUE; } }
3.需要先根据费用排序,然后暴力递归,f(int[][] arr,int index,int k,LinkedList<Integer> fee)。没排序只过了50%超时了。。
public class Weilai { public static void main(String[] args) { Scanner sc = new Scanner(System.in); int n = sc.nextInt(); int k = sc.nextInt(); int[][] arr=new int[n][2]; for(int i=0;i<n;i++) { arr[i][0]=sc.nextInt(); arr[i][1]=sc.nextInt(); } LinkedList<Integer> fee = new LinkedList<>(); Arrays.sort(arr,(o1, o2)->{return o1[0]-o2[0];}); System.out.println(f(arr,0,k,fee)); } public static long f(int[][] arr, int index, int k, LinkedList<Integer> fee) { if(index>=arr.length) { return 0L; } for(int i:fee) { if(Math.abs(arr[index][0]-i)>=k){return 0L;} } long l=0; long r=0; fee.addLast(arr[index][0]); l=f(arr,index+1,k,fee)+arr[index][1];//选择当前 fee.removeLast(); r=f(arr,index+1,k,fee);//不选择当前 return Math.max(l,r); } }