UESTC 1783 Krolia的礼包难题 规律题

Krolia的礼包难题

Time Limit: 1000 ms Memory Limit: 65535 kB Solved: 70 Tried: 313

Submit

Status

Best Solution

Back

Description

Krolia新开了一家礼品店,每天都要接到很多礼品的订购。Krolia送出去的礼品都需要包装。Krolia最后给顾客的是一个或者多个礼包,礼包里面装的礼物刚好是顾客订购的那些礼物。礼包由一些礼品组成,礼包里面每种礼品至多只能有一件。每一种礼包都需要包装纸。内容相同的礼包需要相同的包装纸,内容不同的礼包则需要不同的包装纸。Krolia希望包装纸的种类最少,因为设计一种包装纸很费事。并且Krolia要求一种礼品只能在一种礼包中出现,否则最后配送礼品的时候选择如何打包会很麻烦。现在Krolia的礼品店总共有n种礼品,已知明天客人的订购详细,问Krolia最少需要多少种包装纸。

Input

有多组测试数据。输入的第一行是整数T(0 < T<=100),表示测试数据的组数。每一组测试数据的第一行有两个整数,分别为整数n,m(1<=n,m<=50),表示有n种礼品,m个订购。接下来m行,每行n个数,第i个数为1表示该顾客的订单中购买了第i种礼品,为0则表示没有购买。

Output

每组测试数据一个整数,表示需要的最少包装纸种类数。

Sample Input

2
6 2
1 1 1 0 0 0
0 0 0 1 1 0
3 2
1 1 0
1 0 1

Sample Output

2
3

Hint

样例1:把礼品123打包成礼包1,需要一种包装纸。把礼品45打包成礼包2,需要一种包装纸。
样例2:把礼品1打包成礼包1,需要一种包装纸。把礼品2打包成礼包2,需要一种包装纸。把礼品3打包成礼包3,需要一种包装纸。最后给顾客1礼包12,给顾客2礼包13。

Source

KroliaFansClub



规律题 并且Krolia要求一种礼品只能在一种礼包中出现  注意这句话


在纸上写几组数据可以发现   只要一纵行是相同的可以作为一种礼包

所以只要找出纵行不同的个数


代码:

#include<stdio.h>
int map[100][100];
int lie[100];
int main()
{
	int cas,n,m,i,j,k,t,sum;
	scanf("%d",&cas);
	while(cas--)
	{
		
	      scanf("%d %d",&n,&m);
		  int ans=n;
		  for(i=0;i<m;i++)
			  for(j=0;j<n;j++)
				  scanf("%d",&map[i][j]);
			/*  		  for(i=0;i<m;i++)
					  {
						  for(j=0;j<n;j++)
				  printf("%d ",map[i][j]);
						  printf("\n");
					  }*/
			  for(i=0;i<n;i++)
			  {
				  if(map[0][i]==-1) continue;
                  sum=0;
				  for(j=0;j<m;j++)
				  {
					 lie[j]=map[j][i];//每列赋值成功
					 sum+=lie[j];
				  }
				  if(sum==0) {ans--;continue;}
						 for(k=i+1;k<n;k++)//与后面每列比较
						 {
							 for(t=0;t<m;t++)
								 if(lie[t]!=map[t][k])
									 break;
								 if(t==m)
								 {
                                    for(t=0;t<m;t++)
										map[t][k]=-1;
									 ans--;
								 }
						 }
					 
				  
			  }
			  printf("%d\n",ans);

	}
	return 0;
}



  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值