【枚举】Candle

背景 Background
忘川沧月是一名Oier,他的家族有n个人。每年,当这n个人过生日的时候,忘川沧月都要去给他们买蜡烛。
不过最近忘川沧月却很纠结……因为他爷爷要过68岁生日了,他认为买68根蜡烛简直就是一件**的事情。。。
这天,忘川沧月路过了一个蜡烛商店……

描述 Description
蜡烛商店中有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是不行的,因为每种蜡烛仅有一根。
但是由于这种蜡烛很贵,忘川沧月想购买尽量少的蜡烛来达到他的目的,你能帮帮他吗?

输入格式 Input Format
本题共有5个测试点,每个测试点包含不多于10000组数据。
每组数据包含n+1个用空格隔开的整数,其中第一个整数n是家族成员的数量,接下来n个整数是他们的年龄。
n=0表示输入的结束。

输出格式 Output Format
设需要购买的蜡烛数字从大到小排列构成了一个整数T,如果在购买最少数量的蜡烛的前提下,答案不唯一,请输出T最小的答案。
对于每组数据,按照样例输出的格式,先输出数据编号,再输出T。

样例输入 Sample Input [ 复制数据]
样例输出 Sample Output [ 复制数据]
时间限制 Time Limitation
各个测试点1s

注释 Hint
对于100%的数据,1<=n<=10,每个人的年龄是不大于100的正整数
对于测试点1~2,数据组数不超过100
对于测试点3,数据组数不超过1000

对于测试点4~5,数据组数不超过10000



写了两种方法。

一种是最坏是O(2^10),一种最坏是O(10^10),对没错,事实证明后者更快。。后者的代码复杂度高得多,(400+代码),导致我因为少分了最简单的一类而WA了。


先打了一个0~100的所有年龄,可以由0~9和+表示出来的方案,用二进制表示,注意题目描述不清楚,那个+是可以不用的!


然后枚举所有的方案,最坏O(10^10)的那个是用的迭代加深的思想,保证第一次找到的必定是最优的。而O(2^10)那个是按顺序枚举所有可能的集合。

两者共同要用到之前打的表,比如说30可以用3+0,24+6等表示出来,则要求当前枚举的集合包含了{3,0}或{6,4,2}或。。中的集合。A∩B=B则B是A的子集。



O(2^10)的最慢版本:

#include <cstdio>
#include <string>
#include <cstring>
#define min(a,b) ((a)<(b)?(a):(b))
 
long n = 0;
long hash[][21] = {
{1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0},
{2,2,3,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0},
{2,4,5,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0},
{3,6,8,9,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0},
{3,10,16,17,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0},
{4,12,18,32,33,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0},
{4,20,34,64,65,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0},
{5,24,36,66,128,129,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0},
{5,40,68,130,256,257,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0},
{6,48,72,132,258,512,513,0,0,0,0,0,0,0,0,0,0,0,0,0,0},
{5,3,80,136,260,514,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0},
{4,96,144,264,516,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0},
{5,6,7,160,272,520,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0},
{5,10,11,192,288,528,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0},
{4,18,19,320,544,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0},
{5,14,34,35,384,576,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0},
{4,22,66,67,640,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0},
{5,26,38,130,131,768,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0},
{4,42,70,258,259,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0},
{5,50,74,134,514,515,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0},
{4,5,82,138,262,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0},
{6,6,7,98,146,266,518,0,0,0,0,0,0,0,0,0,0,0,0,0,0},
{3,162,274,522,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0},
{5,12,13,194,290,530,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0},
{5,14,20,21,322,546,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0},
{5,22,36,37,386,578,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0},
{4,38,68,69,642,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0},
{5,28,70,132,133,770,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0},
{4,44,134,260,261,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0},
{5,52,76,262,516,517,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0},
{4,9,84,140,518,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0},
{5,10,11,100,148,268,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0},
{5,12,13,164,276,524,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0},
{5,14,15,196,292,532,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0},
{5,23,24,25,324,548,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0},
{6,26,39,40,41,388,580,0,0,0,0,0,0,0,0,0,0,0,0,0,0},
{6,28,42,71,72,73,644,0,0,0,0,0,0,0,0,0,0,0,0,0,0},
{7,30,44,74,135,136,137,772,0,0,0,0,0,0,0,0,0,0,0,0,0},
{6,46,76,138,263,264,265,0,0,0,0,0,0,0,0,0,0,0,0,0,0},
{8,54,56,78,140,266,519,520,521,0,0,0,0,0,0,0,0,0,0,0,0},
{6,17,86,88,142,268,522,0,0,0,0,0,0,0,0,0,0,0,0,0,0},
{8,18,19,102,104,150,152,270,524,0,0,0,0,0,0,0,0,0,0,0,0},
{8,15,20,21,166,168,278,280,526,0,0,0,0,0,0,0,0,0,0,0,0},
{9,22,24,25,198,200,294,296,534,536,0,0,0,0,0,0,0,0,0,0,0},
{6,26,27,326,328,550,552,0,0,0,0,0,0,0,0,0,0,0,0,0,0},
{8,28,43,48,49,390,392,582,584,0,0,0,0,0,0,0,0,0,0,0,0},
{7,30,50,75,80,81,646,648,0,0,0,0,0,0,0,0,0,0,0,0,0},
{8,46,52,82,139,144,145,774,776,0,0,0,0,0,0,0,0,0,0,0,0},
{7,56,78,84,146,267,272,273,0,0,0,0,0,0,0,0,0,0,0,0,0},
{8,58,88,142,148,274,523,528,529,0,0,0,0,0,0,0,0,0,0,0,0},
{6,33,90,152,270,276,530,0,0,0,0,0,0,0,0,0,0,0,0,0,0},
{9,15,34,35,106,112,154,280,526,532,0,0,0,0,0,0,0,0,0,0,0},
{7,23,36,37,170,176,282,536,0,0,0,0,0,0,0,0,0,0,0,0,0},
{9,27,38,40,41,202,208,298,304,538,0,0,0,0,0,0,0,0,0,0,0},
{8,29,42,48,49,330,336,554,560,0,0,0,0,0,0,0,0,0,0,0,0},
{9,30,44,45,50,51,394,400,586,592,0,0,0,0,0,0,0,0,0,0,0},
{8,46,52,77,83,96,97,650,656,0,0,0,0,0,0,0,0,0,0,0,0},
{10,54,56,78,98,141,147,160,161,778,784,0,0,0,0,0,0,0,0,0,0},
{9,58,86,100,142,162,269,275,288,289,0,0,0,0,0,0,0,0,0,0,0},
{11,60,90,104,150,164,270,290,525,531,544,545,0,0,0,0,0,0,0,0,0},
{9,65,92,112,154,168,278,292,526,546,0,0,0,0,0,0,0,0,0,0,0},
{11,23,66,67,108,114,156,176,282,296,534,548,0,0,0,0,0,0,0,0,0},
{9,39,68,69,172,178,284,304,538,552,0,0,0,0,0,0,0,0,0,0,0},
{12,29,43,70,72,73,204,210,224,300,306,540,560,0,0,0,0,0,0,0,0},
{10,30,51,74,80,81,332,338,352,556,562,0,0,0,0,0,0,0,0,0,0},
{12,46,53,76,82,96,97,396,402,416,588,594,608,0,0,0,0,0,0,0,0},
{8,54,84,85,98,99,652,658,672,0,0,0,0,0,0,0,0,0,0,0,0},
{11,58,86,88,100,149,163,192,193,780,786,800,0,0,0,0,0,0,0,0,0},
{9,60,102,104,150,194,277,291,320,321,0,0,0,0,0,0,0,0,0,0,0},
{11,92,106,112,166,196,278,322,533,547,576,577,0,0,0,0,0,0,0,0,0},
{9,114,129,156,170,200,294,324,534,578,0,0,0,0,0,0,0,0,0,0,0},
{12,27,39,116,130,131,178,208,284,298,328,550,580,0,0,0,0,0,0,0,0},
{11,29,71,132,133,180,224,306,336,540,554,584,0,0,0,0,0,0,0,0,0},
{12,30,45,75,134,136,137,212,226,308,352,562,592,0,0,0,0,0,0,0,0},
{10,46,53,83,138,144,145,340,354,564,608,0,0,0,0,0,0,0,0,0,0},
{13,54,57,78,99,140,146,160,161,404,418,448,596,610,0,0,0,0,0,0,0},
{11,58,86,89,101,148,162,192,193,660,674,704,0,0,0,0,0,0,0,0,0},
{12,60,90,102,152,153,164,165,194,195,788,802,832,0,0,0,0,0,0,0,0},
{11,92,106,154,166,168,196,281,293,323,384,385,0,0,0,0,0,0,0,0,0},
{14,108,114,156,176,198,200,282,294,386,537,549,579,640,641,0,0,0,0,0,0},
{11,116,172,202,208,257,284,326,388,538,550,642,0,0,0,0,0,0,0,0,0},
{14,43,71,120,180,210,224,258,259,300,330,392,540,582,644,0,0,0,0,0,0},
{12,45,135,184,226,260,261,308,338,400,556,586,648,0,0,0,0,0,0,0,0},
{14,46,77,139,216,228,262,264,265,312,354,416,564,594,656,0,0,0,0,0,0},
{13,57,78,85,147,266,272,273,344,356,448,568,610,672,0,0,0,0,0,0,0},
{15,58,86,101,142,163,268,274,288,289,408,420,450,600,612,704,0,0,0,0,0},
{12,60,102,105,150,195,276,290,320,321,664,676,706,0,0,0,0,0,0,0,0},
{15,92,106,154,166,169,197,280,292,322,384,385,792,804,834,896,0,0,0,0,0},
{9,108,170,198,296,297,324,325,386,387,0,0,0,0,0,0,0,0,0,0,0},
{14,116,172,178,202,298,304,326,328,388,553,581,643,768,769,0,0,0,0,0,0},
{11,120,204,210,300,336,390,392,513,554,582,770,0,0,0,0,0,0,0,0,0},
{15,51,75,135,184,212,226,332,352,394,400,514,515,556,646,772,0,0,0,0,0},
{13,53,77,228,263,312,340,402,416,516,517,588,650,776,0,0,0,0,0,0,0},
{16,54,57,78,141,232,267,356,418,448,518,520,521,568,596,658,784,0,0,0,0},
{13,58,89,142,149,275,360,450,522,528,529,612,674,800,0,0,0,0,0,0,0},
{16,60,90,105,150,165,270,291,424,452,524,530,544,545,616,706,832,0,0,0,0},
{14,92,106,113,166,197,278,323,532,546,576,577,680,708,896,0,0,0,0,0,0},
{17,108,114,156,177,198,201,282,294,387,536,548,578,640,641,808,836,898,0,0,0},
{14,116,172,178,202,298,305,326,329,389,552,580,642,768,769,0,0,0,0,0,0},
{14,120,180,204,306,330,390,560,561,584,585,644,645,770,771,0,0,0,0,0,0},
{12,184,212,308,332,338,394,562,586,592,646,648,772,0,0,0,0,0,0,0,0}};
 
long age[110];
long ans[15];
 
inline bool check(long h,long ag)
{
    for (long j=1;j<hash[ag][0]+1;j++)
        if ((h & hash[ag][j]) == hash[ag][j])
            return true;
    return false;
}
 
inline int BitCount(unsigned int n) 
{
    unsigned int tmp = n - ((n >> 1) & 033333333333) - ((n >> 2) & 011111111111);
    return ((tmp + (tmp >> 3)) & 030707070707) % 63;
}
 
inline void work(long h)
{
    for (long i=1;i<n+1;i++)
        if (!check(h,age[i]))
            return;
 
    long bc = BitCount(h);
    ans[bc] = min(ans[bc],h);
}
 
long getint()
{
    long rs=0;bool sgn=1;char tmp;
    do tmp=getchar();
    while (!isdigit(tmp)&&tmp-'-');
    if (tmp=='-'){tmp=getchar();sgn=0;}
    do rs=(rs<<3)+(rs<<1)+tmp-'0';
    while (isdigit(tmp=getchar()));
    return sgn?rs:-rs;
}
 
int main()
{
    long T = 0;
    while (++T)
    {
        memset(ans,0x3f,sizeof(ans));
        n = getint();
        if (n == 0) return 0;
        printf("Case %ld: ",T);
        for (long i=1;i<n+1;i++)
            age[i] = getint();
 
        for (long i=1;i<(1<<10);i++)
            work(i);
 
        for (long i=0;i<11;i++)
        {
            if (ans[i]<0x3f3f3f3f)
            {
                long answer2 = 0;
                for (long j=9;j>=0;j--)
                    if (ans[i]&(1<<j))
                        answer2 = answer2*10+j;
 
                printf("%ld\n",answer2);
                break;
            }
        }
    }
    return 0;
}


优化后的版本:

#include <cstdio>
#include <string>
#include <cstring>
#define min(a,b) ((a)<(b)?(a):(b))

long n = 0;
long hash[][21] = {
{1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0},
{2,2,3,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0},
{2,4,5,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0},
{3,6,8,9,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0},
{3,10,16,17,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0},
{4,12,18,32,33,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0},
{4,20,34,64,65,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0},
{5,24,36,66,128,129,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0},
{5,40,68,130,256,257,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0},
{6,48,72,132,258,512,513,0,0,0,0,0,0,0,0,0,0,0,0,0,0},
{5,3,80,136,260,514,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0},
{4,96,144,264,516,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0},
{5,6,7,160,272,520,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0},
{5,10,11,192,288,528,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0},
{4,18,19,320,544,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0},
{5,14,34,35,384,576,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0},
{4,22,66,67,640,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0},
{5,26,38,130,131,768,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0},
{4,42,70,258,259,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0},
{5,50,74,134,514,515,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0},
{4,5,82,138,262,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0},
{6,6,7,98,146,266,518,0,0,0,0,0,0,0,0,0,0,0,0,0,0},
{3,162,274,522,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0},
{5,12,13,194,290,530,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0},
{5,14,20,21,322,546,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0},
{5,22,36,37,386,578,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0},
{4,38,68,69,642,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0},
{5,28,70,132,133,770,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0},
{4,44,134,260,261,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0},
{5,52,76,262,516,517,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0},
{4,9,84,140,518,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0},
{5,10,11,100,148,268,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0},
{5,12,13,164,276,524,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0},
{5,14,15,196,292,532,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0},
{5,23,24,25,324,548,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0},
{6,26,39,40,41,388,580,0,0,0,0,0,0,0,0,0,0,0,0,0,0},
{6,28,42,71,72,73,644,0,0,0,0,0,0,0,0,0,0,0,0,0,0},
{7,30,44,74,135,136,137,772,0,0,0,0,0,0,0,0,0,0,0,0,0},
{6,46,76,138,263,264,265,0,0,0,0,0,0,0,0,0,0,0,0,0,0},
{8,54,56,78,140,266,519,520,521,0,0,0,0,0,0,0,0,0,0,0,0},
{6,17,86,88,142,268,522,0,0,0,0,0,0,0,0,0,0,0,0,0,0},
{8,18,19,102,104,150,152,270,524,0,0,0,0,0,0,0,0,0,0,0,0},
{8,15,20,21,166,168,278,280,526,0,0,0,0,0,0,0,0,0,0,0,0},
{9,22,24,25,198,200,294,296,534,536,0,0,0,0,0,0,0,0,0,0,0},
{6,26,27,326,328,550,552,0,0,0,0,0,0,0,0,0,0,0,0,0,0},
{8,28,43,48,49,390,392,582,584,0,0,0,0,0,0,0,0,0,0,0,0},
{7,30,50,75,80,81,646,648,0,0,0,0,0,0,0,0,0,0,0,0,0},
{8,46,52,82,139,144,145,774,776,0,0,0,0,0,0,0,0,0,0,0,0},
{7,56,78,84,146,267,272,273,0,0,0,0,0,0,0,0,0,0,0,0,0},
{8,58,88,142,148,274,523,528,529,0,0,0,0,0,0,0,0,0,0,0,0},
{6,33,90,152,270,276,530,0,0,0,0,0,0,0,0,0,0,0,0,0,0},
{9,15,34,35,106,112,154,280,526,532,0,0,0,0,0,0,0,0,0,0,0},
{7,23,36,37,170,176,282,536,0,0,0,0,0,0,0,0,0,0,0,0,0},
{9,27,38,40,41,202,208,298,304,538,0,0,0,0,0,0,0,0,0,0,0},
{8,29,42,48,49,330,336,554,560,0,0,0,0,0,0,0,0,0,0,0,0},
{9,30,44,45,50,51,394,400,586,592,0,0,0,0,0,0,0,0,0,0,0},
{8,46,52,77,83,96,97,650,656,0,0,0,0,0,0,0,0,0,0,0,0},
{10,54,56,78,98,141,147,160,161,778,784,0,0,0,0,0,0,0,0,0,0},
{9,58,86,100,142,162,269,275,288,289,0,0,0,0,0,0,0,0,0,0,0},
{11,60,90,104,150,164,270,290,525,531,544,545,0,0,0,0,0,0,0,0,0},
{9,65,92,112,154,168,278,292,526,546,0,0,0,0,0,0,0,0,0,0,0},
{11,23,66,67,108,114,156,176,282,296,534,548,0,0,0,0,0,0,0,0,0},
{9,39,68,69,172,178,284,304,538,552,0,0,0,0,0,0,0,0,0,0,0},
{12,29,43,70,72,73,204,210,224,300,306,540,560,0,0,0,0,0,0,0,0},
{10,30,51,74,80,81,332,338,352,556,562,0,0,0,0,0,0,0,0,0,0},
{12,46,53,76,82,96,97,396,402,416,588,594,608,0,0,0,0,0,0,0,0},
{8,54,84,85,98,99,652,658,672,0,0,0,0,0,0,0,0,0,0,0,0},
{11,58,86,88,100,149,163,192,193,780,786,800,0,0,0,0,0,0,0,0,0},
{9,60,102,104,150,194,277,291,320,321,0,0,0,0,0,0,0,0,0,0,0},
{11,92,106,112,166,196,278,322,533,547,576,577,0,0,0,0,0,0,0,0,0},
{9,114,129,156,170,200,294,324,534,578,0,0,0,0,0,0,0,0,0,0,0},
{12,27,39,116,130,131,178,208,284,298,328,550,580,0,0,0,0,0,0,0,0},
{11,29,71,132,133,180,224,306,336,540,554,584,0,0,0,0,0,0,0,0,0},
{12,30,45,75,134,136,137,212,226,308,352,562,592,0,0,0,0,0,0,0,0},
{10,46,53,83,138,144,145,340,354,564,608,0,0,0,0,0,0,0,0,0,0},
{13,54,57,78,99,140,146,160,161,404,418,448,596,610,0,0,0,0,0,0,0},
{11,58,86,89,101,148,162,192,193,660,674,704,0,0,0,0,0,0,0,0,0},
{12,60,90,102,152,153,164,165,194,195,788,802,832,0,0,0,0,0,0,0,0},
{11,92,106,154,166,168,196,281,293,323,384,385,0,0,0,0,0,0,0,0,0},
{14,108,114,156,176,198,200,282,294,386,537,549,579,640,641,0,0,0,0,0,0},
{11,116,172,202,208,257,284,326,388,538,550,642,0,0,0,0,0,0,0,0,0},
{14,43,71,120,180,210,224,258,259,300,330,392,540,582,644,0,0,0,0,0,0},
{12,45,135,184,226,260,261,308,338,400,556,586,648,0,0,0,0,0,0,0,0},
{14,46,77,139,216,228,262,264,265,312,354,416,564,594,656,0,0,0,0,0,0},
{13,57,78,85,147,266,272,273,344,356,448,568,610,672,0,0,0,0,0,0,0},
{15,58,86,101,142,163,268,274,288,289,408,420,450,600,612,704,0,0,0,0,0},
{12,60,102,105,150,195,276,290,320,321,664,676,706,0,0,0,0,0,0,0,0},
{15,92,106,154,166,169,197,280,292,322,384,385,792,804,834,896,0,0,0,0,0},
{9,108,170,198,296,297,324,325,386,387,0,0,0,0,0,0,0,0,0,0,0},
{14,116,172,178,202,298,304,326,328,388,553,581,643,768,769,0,0,0,0,0,0},
{11,120,204,210,300,336,390,392,513,554,582,770,0,0,0,0,0,0,0,0,0},
{15,51,75,135,184,212,226,332,352,394,400,514,515,556,646,772,0,0,0,0,0},
{13,53,77,228,263,312,340,402,416,516,517,588,650,776,0,0,0,0,0,0,0},
{16,54,57,78,141,232,267,356,418,448,518,520,521,568,596,658,784,0,0,0,0},
{13,58,89,142,149,275,360,450,522,528,529,612,674,800,0,0,0,0,0,0,0},
{16,60,90,105,150,165,270,291,424,452,524,530,544,545,616,706,832,0,0,0,0},
{14,92,106,113,166,197,278,323,532,546,576,577,680,708,896,0,0,0,0,0,0},
{17,108,114,156,177,198,201,282,294,387,536,548,578,640,641,808,836,898,0,0,0},
{14,116,172,178,202,298,305,326,329,389,552,580,642,768,769,0,0,0,0,0,0},
{14,120,180,204,306,330,390,560,561,584,585,644,645,770,771,0,0,0,0,0,0},
{12,184,212,308,332,338,394,562,586,592,646,648,772,0,0,0,0,0,0,0,0}};

long age[110];
long ans = 0x3f3f3f3f;
long ans2 = 0;
long bc = 0;

inline bool check(long h,long ag)
{
	for (long j=1;j<hash[ag][0]+1;j++)
		if ((h & hash[ag][j]) == hash[ag][j])
			return true;
	return false;
}

inline int BitCount(unsigned int n) 
{
    unsigned int tmp = n - ((n >> 1) & 033333333333) - ((n >> 2) & 011111111111);
    return ((tmp + (tmp >> 3)) & 030707070707) % 63;
}

inline void work(long h)
{
	for (long i=1;i<n+1;i++)
		if (!check(h,age[i]))
			return;

	ans = bc;
	ans2 = h;
}

long getint()
{
	long rs=0;bool sgn=1;char tmp;
	do tmp=getchar();
	while (!isdigit(tmp)&&tmp-'-');
	if (tmp=='-'){tmp=getchar();sgn=0;}
	do rs=(rs<<3)+(rs<<1)+tmp-'0';
	while (isdigit(tmp=getchar()));
	return sgn?rs:-rs;
}

int main()
{
	freopen("birthday.in","r",stdin);
	freopen("birthday.out","w",stdout);

	long T = 0;
	while (++T)
	{
		n = getint();
		if (n == 0) return 0;
		ans = 0x3f3f3f3f;
		ans2 = 0;
		printf("Case %ld: ",T);
		for (long i=1;i<n+1;i++)
			age[i] = getint();

		for (long i=1;i<(1<<10);i++)
		{
			bc = BitCount(i);
			if (bc<ans || bc==ans&&i<ans2)
				work(i);
		}

		long out = 0;
		for (long j=9;j>=0;j--)
			if (ans2&(1<<j))
				out = out*10+j;

		printf("%ld\n",out);
	}
	return 0;
}

O(10^10)版本:


#include <cstdio>
#include <string>
#include <cstring>
#define min(a,b) ((a)<(b)?(a):(b))
 
long n = 0;
long hash[][21] = {
{1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0},
{2,2,3,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0},
{2,4,5,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0},
{3,6,8,9,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0},
{3,10,16,17,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0},
{4,12,18,32,33,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0},
{4,20,34,64,65,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0},
{5,24,36,66,128,129,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0},
{5,40,68,130,256,257,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0},
{6,48,72,132,258,512,513,0,0,0,0,0,0,0,0,0,0,0,0,0,0},
{5,3,80,136,260,514,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0},
{4,96,144,264,516,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0},
{5,6,7,160,272,520,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0},
{5,10,11,192,288,528,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0},
{4,18,19,320,544,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0},
{5,14,34,35,384,576,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0},
{4,22,66,67,640,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0},
{5,26,38,130,131,768,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0},
{4,42,70,258,259,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0},
{5,50,74,134,514,515,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0},
{4,5,82,138,262,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0},
{6,6,7,98,146,266,518,0,0,0,0,0,0,0,0,0,0,0,0,0,0},
{3,162,274,522,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0},
{5,12,13,194,290,530,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0},
{5,14,20,21,322,546,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0},
{5,22,36,37,386,578,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0},
{4,38,68,69,642,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0},
{5,28,70,132,133,770,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0},
{4,44,134,260,261,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0},
{5,52,76,262,516,517,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0},
{4,9,84,140,518,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0},
{5,10,11,100,148,268,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0},
{5,12,13,164,276,524,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0},
{5,14,15,196,292,532,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0},
{5,23,24,25,324,548,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0},
{6,26,39,40,41,388,580,0,0,0,0,0,0,0,0,0,0,0,0,0,0},
{6,28,42,71,72,73,644,0,0,0,0,0,0,0,0,0,0,0,0,0,0},
{7,30,44,74,135,136,137,772,0,0,0,0,0,0,0,0,0,0,0,0,0},
{6,46,76,138,263,264,265,0,0,0,0,0,0,0,0,0,0,0,0,0,0},
{8,54,56,78,140,266,519,520,521,0,0,0,0,0,0,0,0,0,0,0,0},
{6,17,86,88,142,268,522,0,0,0,0,0,0,0,0,0,0,0,0,0,0},
{8,18,19,102,104,150,152,270,524,0,0,0,0,0,0,0,0,0,0,0,0},
{8,15,20,21,166,168,278,280,526,0,0,0,0,0,0,0,0,0,0,0,0},
{9,22,24,25,198,200,294,296,534,536,0,0,0,0,0,0,0,0,0,0,0},
{6,26,27,326,328,550,552,0,0,0,0,0,0,0,0,0,0,0,0,0,0},
{8,28,43,48,49,390,392,582,584,0,0,0,0,0,0,0,0,0,0,0,0},
{7,30,50,75,80,81,646,648,0,0,0,0,0,0,0,0,0,0,0,0,0},
{8,46,52,82,139,144,145,774,776,0,0,0,0,0,0,0,0,0,0,0,0},
{7,56,78,84,146,267,272,273,0,0,0,0,0,0,0,0,0,0,0,0,0},
{8,58,88,142,148,274,523,528,529,0,0,0,0,0,0,0,0,0,0,0,0},
{6,33,90,152,270,276,530,0,0,0,0,0,0,0,0,0,0,0,0,0,0},
{9,15,34,35,106,112,154,280,526,532,0,0,0,0,0,0,0,0,0,0,0},
{7,23,36,37,170,176,282,536,0,0,0,0,0,0,0,0,0,0,0,0,0},
{9,27,38,40,41,202,208,298,304,538,0,0,0,0,0,0,0,0,0,0,0},
{8,29,42,48,49,330,336,554,560,0,0,0,0,0,0,0,0,0,0,0,0},
{9,30,44,45,50,51,394,400,586,592,0,0,0,0,0,0,0,0,0,0,0},
{8,46,52,77,83,96,97,650,656,0,0,0,0,0,0,0,0,0,0,0,0},
{10,54,56,78,98,141,147,160,161,778,784,0,0,0,0,0,0,0,0,0,0},
{9,58,86,100,142,162,269,275,288,289,0,0,0,0,0,0,0,0,0,0,0},
{11,60,90,104,150,164,270,290,525,531,544,545,0,0,0,0,0,0,0,0,0},
{9,65,92,112,154,168,278,292,526,546,0,0,0,0,0,0,0,0,0,0,0},
{11,23,66,67,108,114,156,176,282,296,534,548,0,0,0,0,0,0,0,0,0},
{9,39,68,69,172,178,284,304,538,552,0,0,0,0,0,0,0,0,0,0,0},
{12,29,43,70,72,73,204,210,224,300,306,540,560,0,0,0,0,0,0,0,0},
{10,30,51,74,80,81,332,338,352,556,562,0,0,0,0,0,0,0,0,0,0},
{12,46,53,76,82,96,97,396,402,416,588,594,608,0,0,0,0,0,0,0,0},
{8,54,84,85,98,99,652,658,672,0,0,0,0,0,0,0,0,0,0,0,0},
{11,58,86,88,100,149,163,192,193,780,786,800,0,0,0,0,0,0,0,0,0},
{9,60,102,104,150,194,277,291,320,321,0,0,0,0,0,0,0,0,0,0,0},
{11,92,106,112,166,196,278,322,533,547,576,577,0,0,0,0,0,0,0,0,0},
{9,114,129,156,170,200,294,324,534,578,0,0,0,0,0,0,0,0,0,0,0},
{12,27,39,116,130,131,178,208,284,298,328,550,580,0,0,0,0,0,0,0,0},
{11,29,71,132,133,180,224,306,336,540,554,584,0,0,0,0,0,0,0,0,0},
{12,30,45,75,134,136,137,212,226,308,352,562,592,0,0,0,0,0,0,0,0},
{10,46,53,83,138,144,145,340,354,564,608,0,0,0,0,0,0,0,0,0,0},
{13,54,57,78,99,140,146,160,161,404,418,448,596,610,0,0,0,0,0,0,0},
{11,58,86,89,101,148,162,192,193,660,674,704,0,0,0,0,0,0,0,0,0},
{12,60,90,102,152,153,164,165,194,195,788,802,832,0,0,0,0,0,0,0,0},
{11,92,106,154,166,168,196,281,293,323,384,385,0,0,0,0,0,0,0,0,0},
{14,108,114,156,176,198,200,282,294,386,537,549,579,640,641,0,0,0,0,0,0},
{11,116,172,202,208,257,284,326,388,538,550,642,0,0,0,0,0,0,0,0,0},
{14,43,71,120,180,210,224,258,259,300,330,392,540,582,644,0,0,0,0,0,0},
{12,45,135,184,226,260,261,308,338,400,556,586,648,0,0,0,0,0,0,0,0},
{14,46,77,139,216,228,262,264,265,312,354,416,564,594,656,0,0,0,0,0,0},
{13,57,78,85,147,266,272,273,344,356,448,568,610,672,0,0,0,0,0,0,0},
{15,58,86,101,142,163,268,274,288,289,408,420,450,600,612,704,0,0,0,0,0},
{12,60,102,105,150,195,276,290,320,321,664,676,706,0,0,0,0,0,0,0,0},
{15,92,106,154,166,169,197,280,292,322,384,385,792,804,834,896,0,0,0,0,0},
{9,108,170,198,296,297,324,325,386,387,0,0,0,0,0,0,0,0,0,0,0},
{14,116,172,178,202,298,304,326,328,388,553,581,643,768,769,0,0,0,0,0,0},
{11,120,204,210,300,336,390,392,513,554,582,770,0,0,0,0,0,0,0,0,0},
{15,51,75,135,184,212,226,332,352,394,400,514,515,556,646,772,0,0,0,0,0},
{13,53,77,228,263,312,340,402,416,516,517,588,650,776,0,0,0,0,0,0,0},
{16,54,57,78,141,232,267,356,418,448,518,520,521,568,596,658,784,0,0,0,0},
{13,58,89,142,149,275,360,450,522,528,529,612,674,800,0,0,0,0,0,0,0},
{16,60,90,105,150,165,270,291,424,452,524,530,544,545,616,706,832,0,0,0,0},
{14,92,106,113,166,197,278,323,532,546,576,577,680,708,896,0,0,0,0,0,0},
{17,108,114,156,177,198,201,282,294,387,536,548,578,640,641,808,836,898,0,0,0},
{14,116,172,178,202,298,305,326,329,389,552,580,642,768,769,0,0,0,0,0,0},
{14,120,180,204,306,330,390,560,561,584,585,644,645,770,771,0,0,0,0,0,0},
{12,184,212,308,332,338,394,562,586,592,646,648,772,0,0,0,0,0,0,0,0}};
 
long age[110];
long ans = 0x3f3f3f3f;
long ans2 = 0;
long bc = 0;
 
inline bool check(long h,long ag)
{
    for (long j=1;j<hash[ag][0]+1;j++)
        if ((h & hash[ag][j]) == hash[ag][j])
            return true;
    return false;
}
 
inline int BitCount(unsigned int n) 
{
    unsigned int tmp = n - ((n >> 1) & 033333333333) - ((n >> 2) & 011111111111);
    return ((tmp + (tmp >> 3)) & 030707070707) % 63;
}
 
inline void work(long h)
{
    for (long i=1;i<n+1;i++)
        if (!check(h,age[i]))
            return;
 
    ans = bc;
    ans2 = h;
}
 
long getint()
{
    long rs=0;bool sgn=1;char tmp;
    do tmp=getchar();
    while (!isdigit(tmp)&&tmp-'-');
    if (tmp=='-'){tmp=getchar();sgn=0;}
    do rs=(rs<<3)+(rs<<1)+tmp-'0';
    while (isdigit(tmp=getchar()));
    return sgn?rs:-rs;
}
 
int main()
{
    long T = 0;
    while (++T)
    {
        n = getint();
        if (n == 0) return 0;
        ans = 0x3f3f3f3f;
        ans2 = 0;
        printf("Case %ld: ",T);
        for (long i=1;i<n+1;i++)
            age[i] = getint();
 
        for (long i=1;i<(1<<10);i++)
        {
            bc = BitCount(i);
            if (bc<ans || bc==ans&&i<ans2)
                work(i);
        }
 
        long out = 0;
        for (long j=9;j>=0;j--)
            if (ans2&(1<<j))
                out = out*10+j;
 
        printf("%ld\n",out);
    }
    return 0;
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值