Krolia的礼包难题
Time Limit: 1000 ms Memory Limit: 65535 kB Solved: 70 Tried: 313
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;
}