今日のトップ2018はバックエンド方向(第2陣)のプログラミング問題2、ビーズ問題を校正します.javaコード.

3129 ワード

手串芸能人として、金主がn個の雑色のビーズを含む手串を注文しました.各ビーズは無色か、いくつかの色を塗っています.手串の色がそんなに単調に見えないように、金主は要求した.手串の任意の色(無色を含まない)は、任意の連続したm個のビーズに1回まで現れる.(ここでは手串がリングになっていることに注意してください).手串の色は全部でc種類あります.今、n個のビーズの手串に、各ビーズに含まれる色がそれぞれどれらがあるかを順時針順に教えてあげます.この手串にどれだけの色が要求に合わないかを判断してください.つまり、どの色が任意の連続m個のビーズに少なくとも2回現れたかを尋ねます.
説明を入力:
1行目にn,m,cの3つの数を入力し、スペースで区切ります.(1<=n<=10000,1<=m<=1000,1<=c<=50)次のn行の各行の最初の数num_i(0<=num_i<=c)は、i番目のビーズが何色あるかを示す.次にnum_を順番に読み込みますi番目の柱にx番目の色(1<=x<=c)が含まれていることを示すi個の数字
出力の説明:
非負の整数で、チェーンにどれだけの色が必要とされていないかを示します.
入力例:
5 2 3 
3 1 2 3 

2 2 3
1 2 
1 3
出力例:
2
構想:各ビーズの色は対応するlistに格納され、各ビーズを手列listに格納し、その後各ビーズの各色を遍歴し、包含関係を判断する.01含む関係がtrueであると比較すると、indexが0のビーズが一致していないと判断し、これ以上実行する必要はなく、問題のdemoの最初の行の入力が5 3 3 3であれば、出力結果が4であれば正しい、すると、タイトル通りの入出力(スペースの問題を容易に処理するためにStringでキーボード入力を受け取り、charAtメソッドを使うので、nmcの3つの数は1桁でなければなりません.この受信はスペース分割Stringで配列最適化を返すことができます.このような詳細は気にしないでください).コードは以下の通りです.
package demo;

import java.util.ArrayList;
import java.util.HashSet;
import java.util.List;
import java.util.Scanner;
import java.util.Set;

public class Main1 {
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        String s = sc.nextLine();
        s = s.replaceAll(" ", "");
        int n = s.charAt(0) - '0';
        int m = s.charAt(1) - '0';
        int c = s.charAt(2) - '0';
        List> list = new ArrayList<>();
        for (int i = 0; i < n; i++) {
            String s1 = sc.nextLine();
            s1 = s1.replaceAll(" ", "");
            int num = s1.charAt(0) - '0';
            List ll = new ArrayList<>();
            if (num == 0) {
                ll.add(num);
            } else {
                for (int j = 0; j < num; j++) {
                    int numi = s1.charAt(j + 1) - '0';
                    ll.add(numi);
                }
            }
            list.add(ll);
        }
        sc.close();
        int count =0;
        for (int i = 0; i < list.size(); i++) {
            int j = 0;
            while (j < (m - 1)) {
                if ((i + j) >= list.size() - 1) {
                    for (int k = 0; k < list.get(i + j + 1 - list.size())
                            .size(); k++) {
                        if (list.get(i).contains(
                                list.get(i + j + 1 - list.size()).get(k))) {
                            count++;
                            j = j+m;
                            break;
                        }
                    }

                } else {
                    for (int k = 0; k < list.get(i + j + 1).size(); k++) {
                        if (list.get(i).contains(list.get(i + j + 1).get(k))) {
                            count++;
                            j = j+m;
                            break;
                        }
                    }
                }
                j++;
            }
        }
        System.out.println(count);
    }
}