问题描述
作为一个手串艺人,有金主向你订购了一条包含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
解题思路
总共有c种颜色,即颜色有1-c。然后用从1到c开始遍历与每个珠子的所含颜色进行对比,符合则把该珠子加入数组y(用一个数组y来存储含有该颜色的珠子),再Arrays.sort(y)排序,进行 y[index]-y[index-1] < m 判断,符合则计数+1,即该颜色不符要求。
珠子总共有n个(编号0-n-1),但是手串是环形,所以将珠子个数+2,即珠子编号为{n-1,0,1,…,n-1,1}。设定一个(n+2)(c+1)数组x来存储输入的n行数字,x[i][0]即为num_i。
遇到的问题
1.如何读取数据
一开始想用Scanner套for循环直接存储到数组中,但按我的解题思路想了下,选择了使用BufferedReader按行读取。
2.数组y的数据(即每个颜色所存在的珠子)怎么存储
我选择了ArrayList中的add()方法,将指定的珠子添加到此列表的尾部,再将列表中的元素get()进数组y中进行上述操作。
AC代码
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.ArrayList;
import java.util.Arrays;
public class Main {
public static void main(String[] args) throws IOException {
// TODO Auto-generated method stub
BufferedReader br=new BufferedReader(new InputStreamReader(System.in)