记录编号 185546 评测结果 A
题目名称 [POJ 1014] 大理石分割 最终得分 100
用户昵称 Gravatarmikumikumi 是否通过 通过
代码语言 C++ 运行时间 0.348 s
提交时间 2015-09-07 17:57:41 内存使用 0.71 MiB
显示代码纯文本
#include<iostream>
#include<cstdio>
#include<algorithm>
#include<cstring>
#include<cmath>
#include<iomanip>
#include<queue>
#include<deque>
using namespace std;
int a[7];
int main()
{
	freopen("dividestone.in","r",stdin);
	freopen("dividestone.out","w",stdout);
	int tot=0;
	while(true)
	{
		bool ok=0;
		int now=0;
		bool f[9][60010]={0};
		tot++;
		for(int i=1;i<=6;i++)
		{
			scanf("%d",&a[i]);
			if(a[i]!=0) ok=1;
			now+=a[i]*i;
		}
		if(ok==0) break;
		if(now%2==1)
		{
			printf("Collection #");
			printf("%d",tot);
			printf(":\n");
			printf("Can't be divided.\n");
			printf("\n");
			continue;
		}
		f[0][0]=1;
		f[7][0]=1;
		for(int i=0;i<3;i++)
		{
			f[i][0]=1;
			for(int j=0;j<=now/2;j++)
			{
				if(f[i][j])
				for(int k=0;k<=a[i+1]&&j+(i+1)*k<=now/2;k++)
					f[i+1][j+(i+1)*k]=1;
			}
		}
		for(int i=7;i>4;i--)
		{
			f[i][0]=1;
			for(int j=0;j<=now/2;j++)
			{
				if(f[i][j])
				for(int k=0;k<=a[i-1]&&j+(i-1)*k<=now/2;k++)
					f[i-1][j+(i-1)*k]=1;
			}
		}
		//if(tot==19)
		//for(int i=1;i<=6;i++)
		//	for(int j=0;j<=now/2;j++)
		//		cout<<i<<" "<<j<<" "<<f[i][j]<<endl;
		int ans=0;
		for(int i=0;i<=now/2;i++)
			if(f[3][i]==1&&f[4][now/2-i]==1) ans=1;
		if(ans==1)
		{
			printf("Collection #");
			printf("%d",tot);
			printf(":\n");
			printf("Can be divided.\n");
			printf("\n");
		}
		else
		{
			printf("Collection #");
			printf("%d",tot);
			printf(":\n");
			printf("Can't be divided.\n");
			printf("\n");
		}
	}
	return 0;
}