例题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\n",ans[p]);
    }
    return 0;
}

猜你喜欢

转载自www.cnblogs.com/yichuan-sun/p/9634185.html