【编程题】手串
作者:互联网
时间限制:1秒
空间限制:65536K
作为一个手串艺人,有金主向你订购了一条包含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
参考代码
使用color[x][y]代表颜色x在y个珠子中是否出现,从颜色的角度去判断。
#include<iostream>
using namespace std;
int main()
{
int color[51][10001];
int n,m,c;
cin>>n>>m>>c;
int i,j,x,num_i;
for(i=1;i<n+1;i++)
{
cin>>num_i;
for(j=0;j<num_i;j++)
{
cin>>x;
color[x][i]=1;
}
}
int sum;
for(x=1;x<c+1;x++)//判断颜色x是否合格
{
for(i=1;i<n+1;i++)
{
int count=0;
int value=0;
for(j=0;j<m;j++)//判断之后的m个珠子里颜色x是否重复
{
int key=i+j;
if(key>n)
key=key%n;
if(color[x][key]==1)
{
count++;
if(count==2)
{
sum++;
value=-1;
break;
}
}
}
if(value==-1)
break;
}
}
cout<<sum;
return 0;
}
标签:种颜色,颜色,int,编程,手串,串珠,color 来源: https://blog.csdn.net/weixin_44611644/article/details/95300838