たいちっち

競技プログラミングをしています

【Java】鉄則本_A03_B03

読んでいる本

問題と提出した回答A03

import java.util.Scanner;

public class Main {
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        int N = sc.nextInt();
        int K = sc.nextInt();
        int[] P = new int[N];
        int[] Q = new int[N];

        for (int i = 0; i < N; i++) {
            P[i] = sc.nextInt();
        }
        for (int i = 0; i < N; i++) {
            Q[i] = sc.nextInt();
        }
        boolean flag = false;
        for (int i = 0; i < N; i++) {
            for (int j = 0; j < N; j++) {
                if (P[i] + Q[j] == K) {
                    flag = true;
                    break;
                }
            }
        }
        if (flag) {
            System.out.println("Yes");
        } else {
            System.out.println("No");
        }
        sc.close();
    }
}

2重のfor文を回す。

公式の回答:kyopro-tessoku/codes/java/chap01/answer_A03.java

問題と提出した回答B03

import java.util.Scanner;

public class Main {
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        int N = sc.nextInt();
        int[] A = new int[N];
        for (int i = 0; i < N ; i++) {
            A[i] = sc.nextInt();
        }
        boolean flag = false;
        for (int i = 0; i < N; i++) {
            for (int j = i+1; j < N; j++) {
                for (int k = j+1; k < N; k++) {
                    if (A[i] + A[j] + A[k] == 1000) {
                        flag = true;
                        break;
                    }
                }
            }
        }
        if (flag) {
            System.out.println("Yes");
        } else {
            System.out.println("No");
        }
    }
}

3重のfor文。Nが100なので、多くとも100の3乗の100万回なので計算しきれる。
同じ商品を選択することは出来ないので、2重目(j)、3重目(k)のfor文の開始を工夫する必要があった。

  • i
  • j = i+1
  • k = j + 1

として、同じ商品を選ばないようにしている。

TODO

  • 他のA,B,C問題を解く
  • 本の続きを読む

 

おわり。。