描述
蜡烛商店中有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 }
时间: 2024-10-14 15:15:24