问题小记之手串艺人

这篇博客介绍了一个关于手串艺人的编程问题,金主要求在任意连续的m个串珠中,每种颜色最多出现一次。博主通过遍历颜色并使用排序和数组判断颜色是否符合条件,最终实现解决方案。遇到的问题包括数据读取和颜色珠子存储,通过使用BufferedReader和ArrayList解决。AC代码可在牛客网找到。
摘要由CSDN通过智能技术生成

问题描述

作为一个手串艺人,有金主向你订购了一条包含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)
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Protobuf是一种高效的序列化协议,可以用于数据交换和数据存储。它的主要优势是大小小,速度快,可扩展性强。下面是使用Protobuf的一些小记: 1. 定义消息格式 首先,需要定义消息格式,以便Protobuf可以将数据序列化和反序列化。消息格式定义在.proto文件中,使用protobuf语言编写。例如,下面是一个简单的消息格式定义: ``` syntax = "proto3"; message Person { string name = 1; int32 age = 2; } ``` 这个消息格式定义了一个名为Person的消息,包含两个字段:name和age。 2. 生成代码 一旦消息格式定义好,就可以使用Protobuf编译器生成代码。编译器将根据消息格式定义生成相应的代码,包括消息类、序列化和反序列化方法等。可以使用以下命令生成代码: ``` protoc --java_out=. message.proto ``` 这将生成一个名为message.pb.javaJava类,该类包含Person消息的定义以及相关方法。 3. 序列化和反序列化 一旦生成了代码,就可以使用Protobuf序列化和反序列化数据。例如,下面是一个示例代码,将一个Person对象序列化为字节数组,并将其反序列化为另一个Person对象: ``` Person person = Person.newBuilder() .setName("Alice") .setAge(25) .build(); byte[] bytes = person.toByteArray(); Person deserializedPerson = Person.parseFrom(bytes); ``` 这个示例代码创建了一个Person对象,将其序列化为字节数组,然后将其反序列化为另一个Person对象。在这个过程中,Protobuf使用生成的代码执行序列化和反序列化操作。 以上是使用Protobuf的一些基本步骤和注意事项,希望对你有所帮助!
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值