AcWing 318. 划分大理石

2进制拆分 和 bitset 优化。

我记得 NOI online 有一题(好像叫 买表) 和这题思路差不多。

Code:

#include<set>
#include<map>
#include<queue>
#include<stack>
#include<ctime>
#include<cmath>
#include<bitset>
#include<vector>
#include<cstdio>
#include<cstdlib>
#include<cstring>
#include<iostream>
#include<algorithm>

using namespace std;
typedef long long LL;
typedef unsigned long long ULL;

const int N=60000+5;
bitset<N> f;
int a[10];
int sum;

int main()
{
//	freopen("1.in","r",stdin);
	int i,j;
	while(scanf("%d",&a[1])==1) {
		sum=0;
		for(i=2;i<=6;i++) 	
			scanf("%d",&a[i]);
		for(i=1;i<=7;i++) sum+=i*a[i];
		if(sum==0) break;
		
		if(sum&1) {
			printf("Can't\n");
			continue;
		}
		f.reset();
		f[0]=1;
		for(i=1;i<=6;i++) {
			for(j=1;j<a[i];j<<=1) {
				f|=f<<(j*i);
				a[i]-=j;
			}
			f|=f<<(a[i]*i);
		}
		if(f[sum/2]) printf("Can\n");
		else printf("Can't\n");
	}
	return 0;
}
posted @ 2020-11-28 21:05  cjlworld  阅读(75)  评论(0编辑  收藏  举报