记录编号 | 185546 | 评测结果 | A | ||
---|---|---|---|---|---|
题目名称 | [POJ 1014] 大理石分割 | 最终得分 | 100 | ||
用户昵称 | 是否通过 | 通过 | |||
代码语言 | 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; }