背景 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 [复制数据]
2 10 11 1 30 0
样例输出 Sample Output [复制数据]
Case 1: 654 Case 2: 30
时间限制 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;
}

【枚举】Candle相关推荐

  1. HDU 4430 amp; ZOJ 3665 Yukari#39;s Birthday(二分法+枚举)

    主题链接: HDU:http://acm.hdu.edu.cn/showproblem.php?pid=4430 ZJU:http://acm.zju.edu.cn/onlinejudge/showP ...

  2. 【C#】枚举_结构体_数组

    最近看C#视频,关于这部分,先看了一遍,又照着敲了一遍,自己敲的过程发现了一些有意思的东西. 枚举:定义一个枚举类型的变量,这个变量有很多相同类型的值.比如性别Gender这个变量可以有男和女这两个值 ...

  3. Go 学习笔记(7)— 常量定义、常量使用、枚举用法、iota 常量、不设置初始值常量

    1. 常量定义及分类 1.1 定义 常量是指在程序运行时,不会被修改的量. 常量中的数据类型只可以是布尔型.数字型(整数型.浮点型和复数)和字符串型. 常量的定义格式: const identifie ...

  4. 1137 - Sin your life sin公式 + 枚举

    http://www.ifrog.cc/acm/problem/1137 和差化积公式, 变成2 * sin((x + y) / 2) * cos((x - y) / 2) + sin(n - (x ...

  5. C语言程序设计 细节总结(第9章 结构体共用体枚举)

    第9章 结构体.共用体.枚举 9.1 结构体 1.对于同类型结构体变量之间可以整体一次赋值 9.2 指向结构体的指针 9.2.1结构体变量的指针 1.定义格式:struct 结构体名 *结构体指针变量 ...

  6. java 枚举的继承_java中枚举类可以被继承吗?

    java 枚举类 java中,使用关键字enum来定义枚举类,枚举类是一个特殊的类,大部分功能和普通类是一样的,区别为: ● 枚举类继承了java.lang.Enum类,而不是默认的Object类.而 ...

  7. c语言枚举3位数相加等于10,C语言 联合和枚举

    联合(union): 一.联合说明和联合变量定义 联合也是一种新的数据类型, 它是一种特殊形式的变量. 联合说明和联合变量定义与结构十分相似.其形式为: union 联合名 { 数据类型 成员名; 数 ...

  8. Codeforces Round #359 (Div. 2) C. Robbers' watch 暴力枚举

    题目链接 题意是真的烦,到最后才知道是n个m其实就是限定表的两个时区的位数,所以所当数不够填满时区的时候前边自动补零 思路:首先来说不能有重复的数字的话,小时和分钟的总位数大于7肯定不行. 7的7次方 ...

  9. 《挑战30天C++入门极限》新手入门:C/C++中枚举类型(enum)

        新手入门:C/C++中枚举类型(enum) 如果一个变量你需要几种可能存在的值,那么就可以被定义成为枚举类型.之所以叫枚举就是说将变量或者叫对象可能存在的情况也可以说是可能的值一一例举出来. ...

最新文章

  1. 如何关闭Visual Assist?
  2. 统计数据背后的指数分布模型
  3. 敏捷和DevOps词汇表
  4. 【学术相关】10篇顶会paper,入选微软学者,上海交大吴齐天的科研思考!
  5. 使用Java快速入门的Apache Thrift
  6. python绘制3d机械图_使用python绘制3d的图形
  7. FPGA学习---Modelsim自动仿真
  8. .net mvc ajax 用html()怎么出来正个页面呀,如何使用jquery或ajax为MVC项目更新c#/ asp.net中的razor部分视图...
  9. 苹果Mac最灵活的文件共享工具:​​​​Dropshare
  10. 十三、Linux驱动之触摸屏驱动
  11. vue 点击a链接 实现url下载文件
  12. 谷歌浏览器获取网页元素的xpath
  13. WIFI理论速度计算
  14. 26学习渗透测试工具 Metasploit 的基本用法,包括漏洞扫描、攻击模块
  15. Window的DOS命令
  16. ChatGPT微信插件闪退解决办法
  17. 京东方劝退_正式确认,华为mate40正面照来了,国行价“劝退”!
  18. redis-短信手机号码频次限制
  19. java命令后加绝对路径无法运行
  20. pythonddos监控机素描_基于机器学习的家用物联网设备DDoS检测

热门文章

  1. 『人脸识别系列教程』1·目录与概述
  2. 玩转免费wifi上网软件之WiFi共享精灵
  3. 软件本地化/国际化解决方案 - 多语种代码生成工具
  4. 固件逆向中常用的小工具
  5. IKBC键盘快捷键(typeman系统)
  6. cinema 4d r23|maxon cinema 4d studio r23(3D制作) v23.110中文版
  7. 华为EC169上网卡发短信
  8. 12纳米做出了7纳米的性能,为国产芯片打破美国限制指明道路
  9. vivo 新机现身 GeekBench 数据库
  10. 赋能城市应急系统,推动智慧城市加速落地