【编程题】手串

知识共享许可协议 版权声明:署名,允许他人基于本文进行创作,且必须基于与原先许可协议相同的许可协议分发本文 (Creative Commons

时间限制: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;
}

猜你喜欢

转载自blog.csdn.net/weixin_44611644/article/details/95300838
今日推荐