我还想把它当成一道数学题做,但是发现代码实现太繁琐。直接搜索肯定会超时的,所以我要确定遍历的区间。区间的上界我找到了,但是我无法准确的确定区间下界。所以我觉得这个方法不靠谱,就看了题解。
题解用的预处理,先把所有十万以内的正整数都遍历一遍,得到离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;
}
原文地址:https://www.cnblogs.com/yichuan-sun/p/9634185.html
时间: 2024-10-10 04:54:15