[字節跳動]手串題-非dp簡單解法

作爲一個手串藝人,有金主向你訂購了一條包含n個雜色串珠的手串——每個串珠要麼無色,要麼塗了若干種顏色。爲了使手串的色彩看起來不那麼單調,金主要求,手串上的任意一種顏色(不包含無色),在任意連續的m個串珠裏至多出現一次(注意這裏手串是一個環形)。手串上的顏色一共有c種。現在按順時針序告訴你n個串珠的手串上,每個串珠用所包含的顏色分別有哪些。請你判斷該手串上有多少種顏色不符合要求。即詢問有多少種顏色在任意連續m個串珠中出現了至少兩次。

輸入描述:
第一行輸入n,m,c三個數,用空格隔開。(1 <= n <= 10000, 1 <= m <= 1000, 1 <= c <= 50) 接下來n行每行的第一個數num_i(0 <= num_i <= c)表示第i顆珠子有多少種顏色。接下來依次讀入num_i個數字,每個數字x表示第i顆柱子上包含第x種顏色(1 <= x <= c)

輸出描述:
一個非負整數,表示該手鍊上有多少種顏色不符需求。

輸入例子1:
5 2 3
3 1 2 3
0
2 2 3
1 2
1 3

輸出例子1:
2

例子說明1:
第一種顏色出現在第1顆串珠,與規則無衝突。
第二種顏色分別出現在第 1,3,4顆串珠,第3顆與第4顆串珠相鄰,所以不合要求。
第三種顏色分別出現在第1,3,5顆串珠,第5顆串珠的下一個是第1顆,所以不合要求。
總計有2種顏色的分佈是有問題的。
這裏第2顆串珠是透明的。

	import java.util.*;

public class Hand {

    public static void main (String[] args) {
        Scanner sc  = new Scanner(System.in);
        String[] s = sc.nextLine().split("\\s+");
        int n = Integer.parseInt(s[0]);//珠子數
        int m = Integer.parseInt(s[1]);//間距
        int c = Integer.parseInt(s[2]);//顏色數

        ArrayList<Integer>[] color_poi = new ArrayList[c+1];//記錄每一種顏色的出現位置鏈表,0號位不要
        for (int i=0; i < n; i++) {
            String[] str = sc.nextLine().split("\\s+");
            int t = Integer.parseInt(str[0]);
            if (t == 0) continue;

            for (int j=1; j <= t; j++){
                int detail = Integer.parseInt(str[j]);
                ArrayList<Integer> ls = new ArrayList<>();
                if (color_poi[detail] != null){
                    ls = color_poi[detail];
                }
                ls.add(i);
                color_poi[detail] = ls;
            }

        }

        int result = 0;//記錄結果
        for (int i=1; i < c+1; i++) {//外層控制顏色
            List<Integer> ls = color_poi[i];
            if (ls.size() == 1) continue;
            for (int j = 0; j < ls.size(); j++) {//內層控制顏色距離

                if(j < ls.size()-1){
                    if (ls.get(j+1) - ls.get(j) < m){
                        result++;
                        break;
                    }
                }else if (ls.get(0) + n - ls.get(j) < m){
                    result++;
                }

            }

            }



        System.out.println(result);




    }

}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章