(位运算) Krolia的礼包难题(CD1783)


题意:给出有N种礼物,现在有M个客人要求礼品包装后送出。

         如果有几种物品种是在一起,则可以用同一种包装纸进行包装。

         不同的包装会用不同的包装纸。求最少用的包装纸数。

 

 

思路:一开始做时候是比赛,当时的状态很不好,一开始还以为是

       以前做过的四色问题,就是最多可能有四种包装纸。后来才知道具体的题意,

      是因为没有读懂题真正的意思。今天看了一点电影,激情大开,然后就做这个题,

      看着只有50左右的礼物,直接可以用long long 型的位运算对其进行纪录并保存,

     而且这样还会有操作方便的好处,所以就这样了。

 

 

#include<iostream>
#include<cstdio>
#include<cmath>
#include<cstring>
using namespace std;

int li[55][55];

long long  b[55];

int main()
{
	freopen("in.txt","r",stdin);
	int i,j,k;

	int n,m;
	int t;
	cin>>t;
	 
	while (t--)
	{
		cin>>n>>m;
		for (i=1;i<=m;i++)
		{
			b[i]=0;
			for (j=1;j<=n;j++)
			{
				cin>>li[i][j];
				b[i]=(b[i]<<1)+li[i][j];
				//cout<<li[i][j]<<' ';
			}
			//cout<<endl;
			//cout<<b[i]<<endl;
		}

		int ans=0;
		long long cur=0;
		for (i=1;i<=m;i++)
			cur=cur|b[i];

		long long temp=1;

		//cout<<cur<<endl;
		while (cur)
		{
			temp=1;
			k=56;
			while (k--)
			{
				if (temp&cur)
					break;
				temp=temp<<1;
			}

			long long mm=(1<<55)-1;

			for (i=1;i<=m;i++)
			{
				if (temp&b[i])
					mm=mm&b[i];
				else
					mm=mm&(~b[i]);
			}

			cur=cur&(~mm);
			ans++;

			//cout<<temp<<' '<<cur<<' '<<mm<<endl;
		}
		
		cout<<ans<<endl;

	}


	return 0;
}


 

 

 

Krolia的礼包难题

Time Limit: 1000 ms Memory Limit: 65535 kB Solved: 74 Tried: 323

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值