【每日一题】8月28日题目精讲 编号
链接:https://ac.nowcoder.com/acm/problem/19925
来源:牛客网

题目描述

你需要给一批商品编号,其中每个编号都是一个7位16进制数(由0~9,
a-f组成)。为了防止在人工处理时不小心把编号弄错,要求任意两个编号至少有三个位置对应的数字不相同。第一个编号为0000000,第二个编号为不违反上述规定的前提下最小的编号,…,每次分配一个新编号时,总是选择不和前面编号冲突的最小编号(注意编号都是16进制数,可以比较大小)。
按此规律,前面若干编号分别是:0000000, 0000111, 0000222, …, 0000fff, 0001012,
0001103,0001230,0001321,0001456,… 输入k,你的任务是求出第k小的编号。

输入描述:
第一行为整数k。
输出描述:
输出第k小的编号(字母必须输出小写)。输入保证这个编号存在。
示例1
输入
复制

20

输出
复制

0001321

备注:
对于30%的数据,k≤200;
对于70%的数据,k≤10000;
对于100%的数据,k≤200000。

题解:

暴力出奇迹。。。
题目要求至少有三个位置对应的数字不相同
一个七个数,所以存五个数的信息就行,因为如果五个数一样那肯定不符合要求
七个选五个一共是21种方案
dp[i][a][b][c][d][e]表示第i个位置,5个位置的数是a,b,c,d,e
如果一个数可行也就是21种位置上的数都没被排除

代码:

#include<iostream>
#include<cstdio>
#include<cstring>
#include<cmath>
using namespace std;
#define MAXN 10
#define for10(x) for (x=0;x<16;(x)++)

int a[30][16][16][16][16][16];
int main() {
        /////freopen("loop05.in","r",stdin);
        //freopen("loop05.out","w",stdout);
    int a1,a2,a3,a4,a5,a6,a7,k,s=0;
    cin>>k;
    for10(a1)
    for10(a2)
    for10(a3)
    for10(a4)
    for10(a5)
    for10(a6)
    for10(a7) {
        if(!a[0][a3][a4][a5][a6][a7]
                &&!a[1][a2][a4][a5][a6][a7]
                &&!a[2][a2][a3][a5][a6][a7]
                &&!a[3][a2][a3][a4][a6][a7]
                &&!a[4][a2][a3][a4][a5][a7]
                &&!a[5][a2][a3][a4][a5][a6]
                &&!a[6][a1][a4][a5][a6][a7]
                &&!a[7][a1][a3][a5][a6][a7]
                &&!a[8][a1][a3][a4][a6][a7]
                &&!a[9][a1][a3][a4][a5][a7]
                &&!a[10][a1][a3][a4][a5][a6]
                &&!a[11][a1][a2][a5][a6][a7]
                &&!a[12][a1][a2][a4][a6][a7]
                &&!a[13][a1][a2][a4][a5][a7]
                &&!a[14][a1][a2][a4][a5][a6]
                &&!a[15][a1][a2][a3][a6][a7]
                &&!a[16][a1][a2][a3][a5][a7]
                &&!a[17][a1][a2][a3][a5][a6]
                &&!a[18][a1][a2][a3][a4][a7]
                &&!a[19][a1][a2][a3][a4][a6]
                &&!a[20][a1][a2][a3][a4][a5]) {
            k--;
            if(!k) {
                printf("%x%x%x%x%x%x%x\n",a1,a2,a3,a4,a5,a6,a7);
                return 0;
            }
            a[0][a3][a4][a5][a6][a7]=true;
            a[1][a2][a4][a5][a6][a7]=true;
            a[2][a2][a3][a5][a6][a7]=true;
            a[3][a2][a3][a4][a6][a7]=true;
            a[4][a2][a3][a4][a5][a7]=true;
            a[5][a2][a3][a4][a5][a6]=true;
            a[6][a1][a4][a5][a6][a7]=true;
            a[7][a1][a3][a5][a6][a7]=true;
            a[8][a1][a3][a4][a6][a7]=true;
            a[9][a1][a3][a4][a5][a7]=true;
            a[10][a1][a3][a4][a5][a6]=true;
            a[11][a1][a2][a5][a6][a7]=true;
            a[12][a1][a2][a4][a6][a7]=true;
            a[13][a1][a2][a4][a5][a7]=true;
            a[14][a1][a2][a4][a5][a6]=true;
            a[15][a1][a2][a3][a6][a7]=true;
            a[16][a1][a2][a3][a5][a7]=true;
            a[17][a1][a2][a3][a5][a6]=true;
            a[18][a1][a2][a3][a4][a7]=true;
            a[19][a1][a2][a3][a4][a6]=true;
            a[20][a1][a2][a3][a4][a5]=true;
        }
    }
    return 0;
}