阿里、招银笔试

4.8 阿里

在这里插入图片描述
在这里插入图片描述

代码(没a)
import java.util.*;
public class Main{
    
    
    public static void main(String[] args){
    
    
        Scanner sc = new Scanner(System.in);
        int t = sc.nextInt();
        while(t!=0){
    
    
            int n = sc.nextInt();
            int m = sc.nextInt();
            int a = sc.nextInt();
            int b = sc.nextInt();
            int num = 0;
            //特训时间不足一个木头人的血量,则消灭0
            if(n<a){
    
    
                System.out.print(0);
                continue;
            }
            else{
    
    
                //木头人数量小于攻击范围,经过a时间后全部消灭。
                if(m<=b){
    
    
                    System.out.print(m);
                    continue;
                }
            }
            int[] arr = new int[m];
            int k =0;
            while(m!=0){
    
    
                arr[k] = a;
                m--;
                k++;
            }
            //每次挑最小的b个-1
            while(n!=0){
    
    
                /*Arrays.sort(arr, new Comparator(){
                    @Override
                    public boolean comapre(Integer a1, Integer a2){
                        return a1.compareTo(a2);
                    }
                });*/
                Arrays.sort(arr);
                int i =0;
                while(b!=0){
    
    
                    if(arr[i]!=0 && i<m){
    
    
                        arr[i]-=1;
                        b--;
                        i++;
                    }
					if(i<m)
                        i++;
                }
                n--;
            }
            for(int j =0;j<=m;j++){
    
    
                if(arr[j] == 0)
                    num++;
            }
            System.out.print(num);
            t--;
        }
        
    } 
}


//正解:数学题,n秒攻击,每秒b个,如果可攻击的总血量(n*b)>=怪物血量(m*a),则全部消灭;
public class Main1 {
    
    
    public static void main(String[] args) {
    
    
        int t;
        Scanner scanner=new Scanner(System.in);
        t=scanner.nextInt();
 
        for(int i=1;i<=t;i++){
    
    
            int time=scanner.nextInt();
            int num=scanner.nextInt();
            int first_blood=scanner.nextInt();
            int max_attack=scanner.nextInt();
            if(time < first_blood){
    
    
                System.out.println(0);
                continue;
            }
            if(time == first_blood){
    
    
                System.out.println(max_attack);
                continue;
            }
             //大于总血量
            if(time*max_attack >= num*first_blood){
    
     
                System.out.println(num);
            }
            else
                System.out.println((int) Math.ceil((double) time*max_attack/(double) first_blood));
        }
    }
}
第二题

地图问题,在n*n地图上,从左上角出发,每次沿着上下左右任意方向移动距离小于k,移动位置需要价值高于当前位置价值。求路上的最大累计价值。

作者:offer你看看我
链接:https://www.nowcoder.com/discuss/403478?type=all&order=time&pos=&page=1
来源:牛客网

import java.util.Scanner;
public class Main {
    
    
    public static void main(String[] args) {
    
    
        Scanner scanner=new Scanner(System.in);
        int t=scanner.nextInt();
        for (int i=0;i<t;i++){
    
    
            int n=scanner.nextInt();  
            int max_step=scanner.nextInt();  
            int[][] value=new int[n+1][n+1];
            for (int j=1;j<=n;j++){
    
    
                for (int k=1;k<=n;k++){
    
    
                    value[j][k]=scanner.nextInt();
                }
            }
            int[][] dp=new int[n+1][n+1]; 
            System.out.println(calcMaxWay(1,1,max_step,dp,value));
        }
    }
    private static int calcMaxWay(int x,int y,int max_step,int[][] dp,int[][] value){
    
    
        if (dp[x][y]>0) 
            return dp[x][y];
        int max_sum=0; 
 
        for (int step=1;step<=max_step;step++){
    
    
 
            if(y-step>0 && value[x][y-step]>value[x][y]) max_sum=Math.max(max_sum,calcMaxWay(x,y-step,max_step,dp,value));
            if(y+step<value[1].length && value[x][y+step]>value[x][y]) max_sum=Math.max(max_sum,calcMaxWay(x,y+step,max_step,dp,value));
            if(x-step>0 &&value[x-step][y]>value[x][y]) max_sum=Math.max(max_sum,calcMaxWay(x-step,y,max_step,dp,value));
            if(x+step<value[1].length && value[x+step][y] > value[x][y])max_sum=Math.max(max_sum,calcMaxWay(x+step,y,max_step,dp,value));
        }
        dp[x][y]=value[x][y]+max_sum;
        return dp[x][y];
    }
}

招银

在这里插入图片描述
在这里插入图片描述

代码
import java.util.Scanner;
import java.util.*;
public class Main {
    
    
    public static void main(String[] args) {
    
    
        Scanner sc = new Scanner(System.in);
        int t = sc.nextInt();
        ArrayList<String> strList = new ArrayList<>();
        for(int i =0;i<t;i++){
    
    
            strList.add(sc.next());
        }
        for(int i = 0;i<t;i++){
    
    
            if(isJingx(strList.get(i))){
    
    
                System.out.println("YES");
            }
            else{
    
    
                System.out.println("NO");
            }
        }
    }
    
    public static boolean isJingx(String str){
    
    
        //String rev = str.reverse();
        char[] ch = str.toCharArray();
        int length = ch.length;
        char[] ch2 = new char[length];
        
        for(int j =0;j<length;j++){
    
    
            ch2[j] = ch[length-1-j];
        }
        
        for(int i=0;i<length;i++){
    
    
            if(!isHuiwen(ch[i],ch2[i]))
                return false;
        }
        return true;
    }
    
    public static boolean isHuiwen(char c1, char c2){
    
    
        if(c1 == '1' && c2 == '1')
            return true;
        if((c1 == '2' && c2 == '5')|| (c1 == '5' && c2 == '2'))
            return true;
        if((c1 == '3' && c2 == '8') || (c1 == '8' && c2 == '3'))
            return true;
        if((c1 == '4' && c2 == '7') || (c1 == '7' && c2 == '4'))
            return true;
        if((c1 == '6' && c2 == '9') || (c1 == '9' && c2 == '6'))
            return true;
        return false;
    }
}

在这里插入图片描述

代码(没a)
import java.util.Scanner;
import java.util.*;
public class Main {
    
    
    public static void main(String[] args) {
    
    
        Scanner sc = new Scanner(System.in);
        int t = sc.nextInt();
        ArrayList<String> str = new ArrayList<>();
        ArrayList<Integer> arr = new ArrayList<>();
        for(int i=0;i<t;i++){
    
    
            str.add(sc.next());
            arr.add(sc.nextInt());
        }
        
        for(int i=0;i<t;i++){
    
    
            int res = numMax(str.get(i), arr.get(i));
            System.out.println(res);
        }
    }
    
    //str添加加减号后得到k,满足要求的方案数
    public static int numMax(String str, int k){
    
    
        int num = 0;
        int length = str.length();
        char[] ch = new char[length];
        return insertScheme(ch,0,length-1,k);
    }
    
    public static int insertScheme(char[] ch, int start, int end, int k){
    
    
        int num = 0;
        if(start == end && k==0)
            return 1;
        num += insertScheme(ch,start+1,end,k-ch[start]) + insertScheme(ch,start+1,end,ch[start]-k);
        return num;
    }
}

猜你喜欢

转载自blog.csdn.net/qq_36281031/article/details/105393518