「Poetize6」Candle

描述

蜡烛商店中有10种蜡烛,形状分别是0~9这10个数字,不过对于每种蜡烛,商店的存货量仅有一根。另外,忘川沧月已经有了一个"+"形状的蜡烛。
忘川沧月想购买一些蜡烛,使得他的家族中所有人的年龄都可以用他购买的数字和"+"表示出来。
例如12就有11种表示方法:12、0+12、2+10、3+9、4+8、5+7、7+5、8+4、9+3、10+2、12+0。注意6+6、1+11、11+1是不行的,因为每种蜡烛仅有一根。
但是由于这种蜡烛很贵,忘川沧月想购买尽量少的蜡烛来达到他的目的,你能帮帮他吗?
题解:
出题人说是送分题。。。
感觉写起来很麻烦就没有写,看了标程发现也很简单。。。
lyd:
2^10枚举选了每种选取蜡烛的情况,四次方暴力枚举数字的组合情况,存到一个v[1024][101]的数组里记录能组成哪些年龄即可。

注意到有10000组数据,预处理一下v数组就毫无鸭梨了~~~

代码:

 1 #include<iostream>
 2 #include<cstdio>
 3 #include<cstring>
 4 #include<algorithm>
 5 using namespace std;
 6 bool v[1024][110];
 7 int a[20],b[1024],ans,n,i,j,k,t,x,y;
 8 long long c[1024],temp;
 9 
10 int main()
11 {
12  for(i=0;i<1024;i++)
13  {
14   for(j=9;j>=0;j--)
15    if(i>>j&1) b[i]++,c[i]=c[i]*10+j;
16   for(j=0;j<10;j++)
17    if(i>>j&1) v[i][j]=1;
18   for(j=0;j<10;j++)
19    for(k=0;k<10;k++)
20     if(j!=k&&(i>>j&1)&&(i>>k&1)) v[i][j*10+k]=v[i][j+k]=1;
21   for(j=0;j<10;j++) if(i>>j&1)
22    for(k=0;k<10;k++) if(j!=k&&(i>>k&1))
23     for(x=0;x<10;x++) if(x!=j&&x!=k&&(i>>x&1))
24     {
25      if(j*10+k+x<=100) v[i][j*10+k+x]=1;
26      for(y=0;y<10;y++) if(y!=j&&y!=k&&y!=x&&(i>>y&1))
27       if(j*10+k+x*10+y<=100) v[i][j*10+k+x*10+y]=1;
28     }
29  }
30  while(~scanf("%d",&n)&&n)
31  {
32   ans=100;
33   for(i=1;i<=n;i++) scanf("%d",&a[i]);
34   for(i=1;i<1024;i++)
35   {
36    for(j=1;j<=n;j++) if(!v[i][a[j]]) break;
37    if(j>n&&b[i]<ans||b[i]==ans&&c[i]<temp) ans=b[i],temp=c[i];
38   }
39   printf("Case %d: %lld\n",++t,temp);
40  }
41  return 0;
42 }
View Code

 

posted @ 2014-10-28 12:44  ZYF-ZYF  Views(224)  Comments(0Edit  收藏  举报