首页 > 试题广场 >

给定一个集合 A=[0,1,3,8](该集合中的元素都是在

[问答题]
给定一个集合 A=[0,1,3,8](该集合中的元素都是在 0-9 之间的数字,但未必全部包含), 指 定任意一个正整数 K,请用 A 中的元素组成一个大于 K 的最小正整数。 比如,A=[1,0] K=21 那么输出结构应该为 100
using namespace std;

const int MAXN = 21;

int find_first_of(int k, int h[])
{
    for (int i = k + 1; i <= 9; i++)
        if (h[i]) return i;
    return -1;
}
int find_min(int h[])
{
    for (int i = 0; i <= 9; i++)
        if (h[i]) return i;
    return -1;
}
int find_second(int h[])
{
    for (int i = 1; i <= 9; i++)
        if (h[i]) return i;
    return -1;
}
void find_minimal_k(int k, int a[], int h[], int A[], int n)
{
    int i, j, m, t, first, second, tag, len = 1;
    for (i = 0; i first = find_min(h);
            second = find_second(h);
            while (k)
    {
        a[len++] = k % 10;
            k /= 10;
        }
    for (i = 1, j = len - 1; i t = a[i], a[i] = a[j], a[j] = t;
            for (tag = 0, i = 1; i if (!h[a[i]])
        {
            for (j = i; j >= 1 && !tag; j--)
                    if ((t = find_first_of(a[j], h)) != -1)
                        for (tag = 1, a[j] = t, m = j + 1; m a[m] = first;
                                if (j == 0)
                                    for (tag = 1, a[j] = second, m = j + 1; m a[m] = first;
                            }
}
if (i == len)
{
    for (j = len - 1; j >= 1 && !tag; j--)
        if ((t = find_first_of(a[j], h)) != -1)
            for (tag = 1, a[j] = t, m = j + 1; m a[m] = first;
                    if (j == 0)
                        for (tag = 1, a[j] = second, m = j + 1; m a[m] = first;
                }
        if (a[0]) cout < for (i = 1; i cout < int A[] = {0, 1, 2, 3, 4, 5, 6, 7, 8, 9};
                                  int a[MAXN], h[10];
                                  memset(a, 0, sizeof(a));
                                  memset(h, 0, sizeof(h));
                                  find_minimal_k(123456789, a, h, A, 10);
                                  return 0;
}



发表于 2014-10-25 00:26:13 回复(0)