作为一个手串艺人,有金主向你订购了一条包含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)
输出描述:
一个非负整数,表示该手链上有多少种颜色不符需求。
输入例子:
5 2 3
3 1 2 3
0
2 2 3
1 2
1 3
输出例子:
2
思路:每颗珠子的颜色存入对应的list中,在把每个珠子存入到手串list中,然后遍历每颗珠子的每种颜色,判断包含关系,如题m是2,n=5,则判断index为0 1,12,23,34,40的珠子,假如m为3,则判断01,02,12,13,23,24,34,30,40,41,依次类推,如m>2时,01比较得出包含关系为true,则已经判断index为0的珠子不符合,无需再继续往后执行,题中的demo第一行输入如果是5 3 3,输出结果为4才正确,则按照题意的输入输出(为了方便处理空格问题,我用String来接受键盘输入,用到charAt方法,所以nmc三个数必须为个位数,这个接收可以用空格分割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<Integer>> list = new ArrayList<>();
for (int i = 0; i < n; i++) {
String s1 = sc.nextLine();
s1 = s1.replaceAll(" ", "");
int num = s1.charAt(0) - '0';
List<Integer> 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);
}
}