【BZOJ 2665】 2665: [cqoi2012]编号(暴力?)
2665: [cqoi2012]编号
Time Limit: 3 Sec Memory Limit: 128 MB
Submit: 347 Solved: 217Description
你需要给一批商品编号,其中每个编号都是一个7位16进制数(由0~9, a-f组成)。为了防止在人工处理时不小心把编号弄错,要求任意两个编号至少有三个位置对应的数字不相同。第一个编号为0000000,第二个编号为不违反上述规定的前提下最小的编号,…,每次分配一个新编号时,总是选择不和前面编号冲突的最小编号(注意编号都是16进制数,可以比较大小)。按此规律,前面若干编号分别是:0000000, 0000111, 0000222, …, 0000fff, 0001012, 0001103,0001230,0001321,0001456,…输入k,你的任务是求出第k小的编号。Input
第一行为整数k。Output
输出第k小的编号(字母必须输出小写)。输入保证这个编号存在。Sample Input
20Sample Output
0001321HINT
编号
1-3
4-7
8-10
k
<=200
<=10000
<=200000
Source
【分析】
如此恶心的暴力??
就是说,保证至少5个位置不一样就好了。
7个里面选5个有21种方法。
就f[x][i][j][k][a][b][c]表示x状态,第1位是i,第二位是j。。。。这种数前面有没有存在。
1 #include<cstdio> 2 #include<cstdlib> 3 #include<cstring> 4 #include<iostream> 5 #include<algorithm> 6 using namespace std; 7 8 bool f[25][16][16][16][16][16]; 9 char s[20]="0123456789abcdef"; 10 11 int main() 12 { 13 int n,nw=0; 14 scanf("%d",&n); 15 memset(f,0,sizeof(f)); 16 for(int i=0;i<16;i++)for(int j=0;j<16;j++) 17 for(int k=0;k<16;k++)for(int l=0;l<16;l++) 18 for(int a=0;a<16;a++)for(int b=0;b<16;b++)for(int c=0;c<16;c++) 19 { 20 if(f[1][i][j][k][l][a]||f[2][i][j][k][l][b]||f[3][i][j][k][l][c]||f[4][i][j][k][a][b]|| 21 f[5][i][j][k][a][c]||f[6][i][j][k][b][c]||f[7][i][j][l][a][b]||f[8][i][j][l][a][c]|| 22 f[9][i][j][l][b][c]||f[10][i][j][a][b][c]||f[11][i][k][l][a][b]||f[12][i][k][l][a][c]|| 23 f[13][i][k][l][b][c]||f[14][i][k][a][b][c]||f[15][i][l][a][b][c]||f[16][j][k][l][a][b]|| 24 f[17][j][k][l][a][c]||f[18][j][k][l][b][c]||f[19][j][k][a][b][c]||f[20][j][l][a][b][c]||f[21][k][l][a][b][c]) 25 continue; 26 nw++; 27 if(nw==n) {printf("%c%c%c%c%c%c%c\n",s[i],s[j],s[k],s[l],s[a],s[b],s[c]);return 0;} 28 f[1][i][j][k][l][a]=f[2][i][j][k][l][b]=f[3][i][j][k][l][c]=f[4][i][j][k][a][b]= 29 f[5][i][j][k][a][c]=f[6][i][j][k][b][c]=f[7][i][j][l][a][b]=f[8][i][j][l][a][c]= 30 f[9][i][j][l][b][c]=f[10][i][j][a][b][c]=f[11][i][k][l][a][b]=f[12][i][k][l][a][c]= 31 f[13][i][k][l][b][c]=f[14][i][k][a][b][c]=f[15][i][l][a][b][c]=f[16][j][k][l][a][b]= 32 f[17][j][k][l][a][c]=f[18][j][k][l][b][c]=f[19][j][k][a][b][c]=f[20][j][l][a][b][c]=f[21][k][l][a][b][c]=1; 33 } 34 return 0; 35 }
2017-04-06 08:48:53