首页 > 代码库 > 「Poetize6」Candle

「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

 

「Poetize6」Candle