思维题
发布日期: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数组标记某一种元素是否已经计算过,

我们一直维护最近出现的颜色的位置,毕竟越后面的越有可能满足条件,当然我们有可能在最后几个数与前面几个数满足条件,那么我们用数组保存第一个颜色出现的下标即可,毕竟越前面的和最后面的更容易满足条件。

#include
using 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秒

关于作者

    喝酒易醉,品茶养心,人生如梦,品茶悟道,何以解忧?唯有杜康!
-- 愿君每日到此一游!

推荐文章