例题3-5 Digit Generator UVA - 1583

Posted yichuan-sun

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了例题3-5 Digit Generator UVA - 1583相关的知识,希望对你有一定的参考价值。

我还想把它当成一道数学题做,但是发现代码实现太繁琐。直接搜索肯定会超时的,所以我要确定遍历的区间。区间的上界我找到了,但是我无法准确的确定区间下界。所以我觉得这个方法不靠谱,就看了题解。

题解用的预处理,先把所有十万以内的正整数都遍历一遍,得到离i最近的以i为最小生成元的数t。以t为下标,将i赋值给ans[t],继续遍历。如果接下来存在另一个i,为t的生成元,并且比原先的ans[t]更小,就ans[t]=i,否则不处理。最后直接输入一个数,输出答案数组中这个数的值即可。

#include <bits/stdc++.h>
#define N 100005
using namespace std;
int ans[100005];
int main()  {
    int n,p;
    scanf("%d",&n);
    for (int i=1;i<=100000;i++) {
        int sum=i,t=i;
        while (t!=0)    {
            sum+=t%10;
            t/=10;
        }
        if (ans[sum]==0||ans[sum]>i)
            ans[sum]=i;
    }
    while (n--) {
        scanf("%d",&p);
        printf("%d
",ans[p]);
    }
    return 0;
}

以上是关于例题3-5 Digit Generator UVA - 1583的主要内容,如果未能解决你的问题,请参考以下文章

最小生成元 (Digit Generator, ACM/ICPC Seoul 2005, UVa1583)

UVa 1587 - Digit Generator

uva 1583 Digit Generator(Uva-1583)

Digit Generator UVa1583

例题 3-5 谜题 uva227

Digit Generator(生成元)