0911京东笔试

第一题
模拟在一个不重复字符键盘上
输出一个指定字符串要要多大代价?
最开始在0,0的位置
移动一格需要x的代价
敲击一个字符要z的代价
发生转向要y的代价

输入
n,m,x,y,z
n代表输入n行,m代表每行字符数

样例
2 2 1 1 1
.E
:F
EE:F.:

输出
15

import java.util.HashMap;
import java.util.Scanner;

/**
 * @data 2021/9/11 18:47
 **/
public class Main {
    public static void main(String[] args) {
        Scanner s = new Scanner(System.in);
        int n = s.nextInt();
        int m = s.nextInt();
        int x = s.nextInt();
        int y = s.nextInt();
        int z = s.nextInt();
        HashMap<Character,point> hmap = new HashMap<>();
        String ss;
        s.nextLine();
        for(int i=0;i<n;i++){
            ss = s.next();
            for(int j=0;j<m;j++){
                point p = new point(i,j);
                hmap.put(ss.charAt(j),p);
            }
        }
        ss = s.next();
        point p = new point(0,0);
        point temp;
        long sum = 0;
        for(int i=0;i<ss.length();i++){
            temp = hmap.get(ss.charAt(i));
            //移动的距离
            sum += p.dist(temp) * x;
            sum += z;
            if(p.judge(temp)){
                sum += y;
            }
            p = temp;
        }
        System.out.println(sum);
    }
    public static class point
    {
        int x;
        int y;
        
        public point(int x, int y) {
            this.x = x;
            this.y = y;
        }
        public int dist(point p){
            return Math.abs(x-p.x) + Math.abs(y-p.y);
        }
        public boolean judge(point p){
            if(Math.abs(x-p.x) > 0 && Math.abs(y-p.y) > 0){
                return true;
            }
            return false;
        }
    }
}

第二题
一共有n个服务,服务之间会有依赖关系,如果a依赖于b,开启a就要一起开启b,关闭b,就会把a也关闭,刚开始服务都是关闭的,经过一些操作之后输出当前开启服务的数量。
输入格式
n,q
之后n行 先输入一个c,之后c个字符表示第i项的依赖
之后q行 每行两个数,第一个数是1表示开启服务,后面是开启服务项
如果是0表示关闭服务,后面接一个关闭的服务项
样例
3 2
1 2
1 3
0
1 1
0 2
输出
3
1

public class Main {
    public static void main(String[] args) {
        Scanner s = new Scanner(System.in);
        int n = s.nextInt();
        int q = s.nextInt();
        boolean[] visit = new boolean[n];
        boolean[][] al = new boolean[n+1][n+1];
        boolean[][] bl = new boolean[n+1][n+1];
        int c,d;
        for(int i=1;i<=n;i++){
            c = s.nextInt();
            for(int j=0;j<c;j++){
                d = s.nextInt();
                al[i][d] = true;
                bl[d][i] = true;
            }
        }
        solve(al,n);
        solve(bl,n);
        for(int i=0;i<q;i++){
            c = s.nextInt();
            if(c==1){
                d = s.nextInt();
                visit[d-1] = true;
               for(int j=1;j<=n;j++){
                   if(al[d][j]){
                       visit[j-1] = true;
                   }
               }
                System.out.println(sum(visit));
            }
            else{
                d = s.nextInt();
                visit[d-1] = false;
                for(int j=1;j<=n;j++){
                    if(bl[d][j]){
                        visit[j-1] = false;
                    }
                }
                System.out.println(sum(visit));
            }
        }
    }
    public static int sum(boolean[] visit){
        int sum = 0;
        for(int i=0;i<visit.length;i++){
            if(visit[i]){
                sum++;
            }
        }
        return sum;
    }
    public static void solve(boolean[][] v,int n){
        for(int i=1;i<=n;i++){
            for(int j=1;j<=n;j++){
                if(v[i][j]){
                    for(int k=1;k<=n;k++){
                        v[i][k] = v[i][k] || v[j][k];
                    }
                }
            }
        }
        for(int i=1;i<=n;i++){
            for(int j=1;j<=n;j++){
                if(v[i][j]){
                    for(int k=1;k<=n;k++){
                        v[i][k] = v[i][k] || v[j][k];

                    }
                }
            }
        }
    }
    public static void print(boolean[][] v){
        for(int i=1;i<v.length;i++){
            System.out.println(Arrays.toString(v[i]));
        }
    }
}

上一篇:Java 矩阵螺旋


下一篇:出30道四则运算题目