Untitled

 avatar
unknown
plain_text
a year ago
3.2 kB
3
Indexable
import java.util.Scanner;
import java.util.Arrays;

public class Main {
    static int[] working;
    static int[] operations;
    static int answer = Integer.MAX_VALUE;
    static int n, m, o;

    static int eval(int prev, int curr, int op) {
        if (prev == -10000000) {
            return curr;
        }

        switch (op) {
            case 1:
                return prev + curr;
            case 2:
                return prev - curr;
            case 3:
                return prev * curr;
            case 4:
                if (curr == 0) {
                    return -1;
                } else {
                    return prev / curr;
                }
            default:
                return 0;
        }
    }

    static boolean isDone(int prev, int curr, int Operation, int target) {
        if (Operation == 4 && curr == 0) {
            return false;
        }

        return eval(prev, curr, Operation) == target;
    }

    static void findMinTouch(int prev, int curr, int ooperation, int tou, int t) {
        if (ooperation != -1 && curr != -10000000) {
            boolean k = isDone(prev, curr, ooperation, t);
            if (k && tou < o) {
                if (answer > tou + 1) {
                    answer = tou + 1;
                }
            }
        }

        if (prev == t && tou < o && ooperation != -1 && curr == -10000000) {
            answer = Math.min(answer, tou);
        }

        if (ooperation == -1 && curr == t && tou < o) {
            answer = Math.min(answer, tou);
        }

        if (tou > o) return;

        for (int i = 0; i < m; i++) {
            if (curr == -10000000) break;
            if (curr == 0 && ooperation == 4) continue;
            int val = eval(prev, curr, ooperation);
            findMinTouch(val, -10000000, operations[i], tou + 1, t);
        }

        for (int i = 0; i < n; i++) {
            if (curr == -10000000) {
                findMinTouch(prev, working[i], ooperation, tou + 1, t);
            } else {
                int val = Math.abs(curr);
                val = val * 10 + working[i];
                if (curr < 0) {
                    val *= -1;
                }
                findMinTouch(prev, val, ooperation, tou + 1, t);
            }
        }
    }

    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        int t = sc.nextInt();
        int count = 0;

        while (t-- > 0) {
            answer = Integer.MAX_VALUE;
            n = sc.nextInt();
            m = sc.nextInt();
            o = sc.nextInt();
            working = new int[n];
            for (int i = 0; i < n; i++) {
                working[i] = sc.nextInt();
            }
            operations = new int[m];
            for (int i = 0; i < m; i++) {
                operations[i] = sc.nextInt();
            }

            int target = sc.nextInt();

            findMinTouch(-10000000, -10000000, -1, 0, target);
            count++;
            System.out.println("#" + count + ": " + answer);
        }

        sc.close();
    }
}
Editor is loading...
Leave a Comment