例题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)