【集合分组】解题报告

3.集合分组(device.c/cpp)

[问题描述]

现有K个整数集合,第i个集合有Sumi个元素。

集合中的数都为正数,且不大于N。

现有定义集合A与集合B相似;

1.B与A相似;

2.将A集合删去一个元素,或更改一个元素的值之后A集合与B集合相等。

现要将K个集合分成至多M组(M>N),使得每一组内的集合互不相似。要求你给出一种合法的方案。如果无解请输出“impossible”。

[输入格式]

输入文件第一行有三个数N,K,M,意义如题目所述。

接下来有K行,每行第一数Sum表示序列长度。之后Sum个数为些集合的元素。

[输出格式]

输出文件有K个数,表示每个集合(按输入顺序)被分到的组的编号(1~M)。

[样例输入]

8 20 12

5 1 3 5 6 4

5 1 3 5 6 3

4 5 6 3 3

4 5 6 3 4

4 4 6 5 8

4 7 7 7 7

3 7 7 7

2 2 2

3 2 2 7

3 1 2 3

3 1 2 4

10 1 2 3 4 56 7 8 7 6

10 8 7 6 5 43 2 1 2 1

20 1 2 3 4 56 7 8 1 2 3 4 5 6 7 8 1 3 5 7

5 4 6 4 6 4

5 6 4 6 4 6

6 6 6 6 6 6 6

3 6 6 6

1 1

1 2

[样例输出]

2

1

9

1

6

2

4

5

3

7

8

5

4

8

7

9

1

1

2

3

[数据范围]

对于30%的数据满足N≤10,M≤2,K≤10。

对于100%的数据满足N≤100,M≤100,K≤50000,Sum≤100。



数论题,这道题是春哥给我们讲的。根据这里相似的定义,如果两个集合相似,则集合和的差大于0且小于n,所以两个集合和对(n+1)取模如果相同,则必定不相似;同样的如果相似,则模一定不相同。。。这个证明下午来写。。。。


#include <iostream>
using std::cout;
long n;long k;long m;
int main()
{
	freopen("device.in","r",stdin);
	freopen("device.out","w",stdout);
	
	scanf("%ld%ld%ld",&n,&m,&k);
	for (long i=1;i<k+1;i++)
	{
		long t;scanf("%ld",&t);
		long tt=0;long ttt;
		
		for (long i=1;i<t+1;i++)
		{
			scanf("%ld",&ttt);
			tt += ttt;
		}
		printf("%ld\n",(tt%(n+1))+1);
	}
}


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值