
思维题
发布日期:2021-05-07 06:55:46
浏览次数:13
分类:技术文章
本文共 1148 字,大约阅读时间需要 3 分钟。
题目描述
作为一个手串艺人,有金主向你订购了一条包含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 输出 复制 2 说明 第一种颜色出现在第1颗串珠,与规则无冲突。 第二种颜色分别出现在第 1,3,4颗串珠,第3颗与第4颗串珠相邻,所以不合要求。 第三种颜色分别出现在第1,3,5颗串珠,第5颗串珠的下一个是第1颗,所以不合要求。 总计有2种颜色的分布是有问题的。 这里第2颗串珠是透明的。我们用一个vis数组标记某一种元素是否已经计算过,
我们一直维护最近出现的颜色的位置,毕竟越后面的越有可能满足条件,当然我们有可能在最后几个数与前面几个数满足条件,那么我们用数组保存第一个颜色出现的下标即可,毕竟越前面的和最后面的更容易满足条件。#includeusing namespace std;const int maxn=100;int a[maxn];int b[maxn];int vis[maxn];int main(){ int n,m,c; cin>>n>>m>>c; int ans=0; memset(a,-1,sizeof a); for(int i=1;i<=n;i++) { int x; cin>>x; for(int j=1;j<=x;j++) { int k; cin>>k; if(vis[k])//如果当前颜色已经计算过就跳过 continue; if(a[k]!=-1&&i-a[k]
发表评论
最新留言
第一次来,支持一个
[***.219.124.196]2025年03月28日 05时41分06秒
关于作者

喝酒易醉,品茶养心,人生如梦,品茶悟道,何以解忧?唯有杜康!
-- 愿君每日到此一游!
推荐文章
shell echo单行和多行文字定向写入到文件中
2019-03-06
解析树状数组
2019-03-06
AtCoder Beginner Contest 100 题解
2019-03-06
【数据结构】可持久化线段树初步
2019-03-06
克拉默法则&矩阵分块:线性代数学习笔记2
2019-03-06
后缀树
2019-03-06
Java高性能编程之CAS与ABA及解决方法
2019-03-06
从BIO到Netty的演变
2019-03-06
《算法导论》第二章笔记
2019-03-06
HTML `capture` 属性
2019-03-06
CSS盒子模型
2019-03-06
HTML节点操作
2019-03-06
浏览器页面呈现过程
2019-03-06
HTML5新特性
2019-03-06
async/await剖析
2019-03-06
cmp命令
2019-03-06
一次编辑
2019-03-06
od命令
2019-03-06
简单工厂模式
2019-03-06
代理模式
2019-03-06