Java Blue Bridge Cup Simulatorのタイトル(パート2)

らせん行列

問題の説明
  n行m列のテーブルの場合、スパイラル法を使用してテーブルに正の整数を順番に入力できます。入力したテーブルをスパイラル行列と呼びます。
  たとえば、4行5列のらせん行列は次のとおりです
  。1 2 3 4 5
  14 15 16 17 6
  13 20 19 18 7
  12 11 10 9 8
入力形式入力
  の最初の行には、それぞれらせんを表す2つの整数n、mが含まれます。行列の行と列の数。
  2行目には、必要な行番号と列番号を示す2つの整数r、cが含まれています。
出力形式
  は、らせん行列の行rおよび列cの要素の値を表す整数を出力します
入力例
4 5
2 2
出力例
15
評価のユースケースのサイズと合意
  30%の評価のユースケースの場合、2 <= n、m <= 20
  評価ユースケースの70%の場合、2 <= n、m <= 100。
  すべての評価ユースケースで、2 <= n、m <= 1000、1 <= r <= n、1 <= c <= m。

import java.util.Scanner;

public class _007{
    static int [][] array = new int [1000][1000];  //定义数组及大小
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        int n = sc.nextInt();  //行数
        int m = sc.nextInt();  //列数

        int r1 = sc.nextInt();
        int c1 = sc.nextInt();
        int num = 0;
        int r = 1,c = 0;
        while(num != n * m) {
            while(c < m && array[r][c+1] == 0)
                array[r][++c] = ++ num;
            while(r < n && array[r+1][c] == 0)
                array[++r][c] = ++ num;
            while(c > 1 && array[r][c-1] == 0)
                array[r][--c] = ++ num;
            while(r > 1 && array[r-1][c] == 0)
                array[--r][c] = ++ num;
        }
        System.out.println(array[r1][c1]);
    }
}

ウォブルシーケンス

問題の説明
  シーケンスの奇数項が前の項より大きく、偶数項が前の項よりも小さい場合、ウォブルシーケンスと呼ばれます。これは、[2i] <a [2i-1]、a [2i + 1]> a [2i]です。
  Xiaomingは、長さがmであり、各数が1からnまでの正の整数であるウォブルシーケンスの数を知りたいと考えています。
入力フォーマット
  入力行には2つの整数m、nが含まれています。
出力フォーマット
  は、答えを示す整数を出力します答えが大きいかもしれませんが、余りを10000で割って出力してください。
サンプル入力
3 4
サンプル出力
14
サンプルの説明
  以下は、要件を満たすスイングシーケンスです
  。2 1 2
  2 1 3
  2 1 4
  3 1 2
  3 1 3
  3 1 4
  3 2 3
  3 2 4
  4 1 2
  4 1 3
  4 1 4
  4 2 3
  4 2 4
  4 3 4
評価の使用例のサイズと規則
  20%の評価の使用例の場合、1 <= n、m <= 5;
  50%の評価の使用例の場合、1 <= n、m <= 10 ;
  評価のユースケースの80%の場合、1 <= n、m <= 100;
  すべての評価ユースケースで、1 <= n、m <= 1000。

public class _008 {
    public static void main(String[] args){
        Scanner sc = new Scanner(System.in);
        int m = sc.nextInt();
        int n = sc.nextInt();
        int[][] ch =new int[m+2][n+2];
        for (int i =1 ; i <= n ;i++){
            ch[1][i]=n-i+1;
        }
        for(int i=2;i<=m;i++){
            if((i&1)==1){
                for(int j=n;j>=1;j--)
                    ch[i][j]=(ch[i-1][j-1]+ch[i][j+1])%1000;
            }else{
                for(int j=1;j<=n;j++)
                    ch[i][j]=(ch[i-1][j+1]+ch[i][j-1])%1000;
            }
        }
        int result= (m&1)==1? ch[m][1]:ch[m][n];
        System.out.println(result);
    }
}

世帯力

問題の説明
  2015年、世帯は中国全土で電気を利用することができました。Xiaomingは電力メーカーとして、Belt and Roadに沿った国々が電力を得られるように支援しています。
  今回、Xiaomingはnの村が電気を得るのを助けたいと思います、その中で、村1は発電所を建設することができ、生成された電気はすべての村に十分です。
  現在、n個の村の間に接続されている配線はありません。Xiaomingの主なタスクは、これらの村を接続するための配線を立てて、すべての村が発電所に直接または間接的に接続されるようにすることです。
  Xiaomingはすべての村の位置(座標)と高さを測定しました。2つの村を接続する場合、Xiaomingは2つの村間の座標距離と高さの差の2乗を費やす必要があります。これは(x_1、y_1)高さの座標として正式に記述されていますh_1の村と座標(x_2、y_2)の村とh_2の高さの接続は
  sqrt((x_1-x_2)(x_1-x_2)+(y_1-y_2)(y_1-y_2))+(h_1 -h_2)*(h_1-h_2)。
  上記の式で、sqrtは括弧の平方根を取ることを意味します。ブラケットの位置に注意してください。高さの計算方法は、水平および垂直座標の計算方法とは異なります。
  資金が限られているため、Xiaomingが少なくともnの村を活性化するのにどれだけの費用がかかるかを計算するのを手伝ってください。
入力形式入力
  の最初の行には、村の数を表す整数nが含まれています。
  次のn行では、3つの整数x、y、hはそれぞれ、村の水平、垂直、高さを表しており、最初の村で発電所を設置できます。
出力フォーマット
  回答を示すために小数点以下2桁に丸められた実数を含む行を出力します。
入力例
4
1 1 3
9 9 7
8 8 6
4 5 4
出力例
17.41
評価のユースケースサイズと合意
  30%の評価のユースケースでは、1 <= n <= 10;
  60%の評価のユースケースでは、1 <= n <= 100;
  すべての評価のユースケースで、 1 <= n <= 1000、0 <= x、y、h <= 10000。

未定。

Xiaoming植栽木

問題の説明
  Xiaomingは友人と一緒に郊外に木を植え、研究室で慎重に研究されたいくつかの苗木を持ち込みました。
  Xiao Mingと彼の友人にはn人の人々がいますが、慎重に選択した後、各人が合計nの空き地に植林するのに適した場所を選択しました。彼らは彼らが持ってきたすべての苗木を植えるつもりです。
  しかし、彼らは困難に直面しました:いくつかの苗木は比較的大きく、いくつかは近すぎたため、植えたときに2本の木が衝突しました。
  彼らは木を円として見、円の中心は彼らが探していた場所にありました。2本の木に対応する円が交差する場合、2本の木は同時に植えるのに適していません(接線は影響を受けません)。これは2本の木の間の競合と呼ばれます。
  Xiaomingと彼の友人たちは、最初に合計し、それらの一部のみを植えることで、競合する木がないことを確認することにしました。彼らはまた、これらの木が最大の領域(円の領域)をカバーできることを期待しています。
入力形式入力
  の最初の行には整数nが含まれ、これは人の数、つまり植え付けられる位置の数を表します。
  次のn行は、3つの整数x、y、rの各行で、オープングランド上の木の水平、垂直、半径を表します。
出力形式
  出力ラインには整数が含まれ、競合することなく植えられる面積の合計を表します。各ツリーの面積はpiの整数倍なので、piで割った値を出力してください(整数である必要があります)。
サンプル入力
6
1 1 2
1 4 2
1 7 2
4 1 2
4 4 2
4 7 2
サンプル出力
12
評価ユースケースのサイズと合意
  30%評価ユースケースの場合、1 <= n <= 10;
  評価のユースケースの60%の場合、1 <= n <= 20、
  すべての評価のユースケースの場合、1 <= n <= 30、0 <= x、y <= 1000、1 <= r <= 1000。

import java.util.Scanner;

public class _010 {
    public static boolean[][] bool = new boolean[30][30];
    static boolean[] vis = new boolean[30];
    public static int[] x = new int[30];
    public static int[] y = new int[30];
    public static int[] r = new int[30];
    public static int n = 0, max = -1;

    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        n = sc.nextInt();
        for (int i = 1; i <= n; i++) {
            x[i] = sc.nextInt();
            y[i] = sc.nextInt();
            r[i] = sc.nextInt();
        }
        for (int i = 1; i <= n; i++) {
            for (int j = i + 1; j <= n; j++) {
                boolean bo = ((x[i] - x[j]) * (x[i] - x[j]) + (y[i] - y[j]) * (y[i] - y[j]) > (r[i] + r[j])
                        * (r[i] + r[j]));
                bool[i][j] = bo;
                bool[j][i] = bo;
            }
        }
        sc.close();
        dfs(1);
        System.out.println(max);
    }

    public static void dfs(int step) {
        if (step > n) {
            int sum = 0;
            for (int i = 1; i <= n; i++) {
                if (vis[i]) {
                    sum += (r[i] * r[i]);
                }
            }
            max = Math.max(sum, max);

            return;
        }

        vis[step] = false;
        dfs(step + 1);
        for (int i = 1; i < step; i++) {
            if (vis[i] && !bool[i][step]) {
                return;
            }

        }
        vis[step] = true;
        dfs(step + 1);
    }
}

おすすめ

転載: www.cnblogs.com/qimuz/p/12727916.html