acm 2005 生成元问题 给出n(1≤n≤100000),求最小生成元。无解输出0

#include
#include
const int maxn = 100000 + 5;
int ans[maxn];
void solve() //离线做法
{
memset(ans, 0, sizeof(ans));
for (int i = 1; i < maxn; i++)
{
int x = i, y = i;
while (x)
{
y += x % 10;
x /= 10;
}
if (ans[y] == 0 || i < ans[y]) //请问这句能否改为if (ans[y] == 0)即去掉后面的判断条件,如果不能,能否找个特例?感谢大神的帮助!!!
ans[y] = i;
}
}
int main()
{
int T, n;
solve();
scanf("%d", &T);
while (T--)
{
scanf("%d", &n);
printf("%d\n", ans[n]);
}
}

基本的想法我能看懂,就是我注释的那行我不太懂,ans[y]初值为零的时候肯定小于i,那个i会不断变大,所以ans[y]已经得到赋值的时候肯定会小于i,即后面的判断语句(||i < ans[y])肯定是false,也就是可以省略掉,请问我这个想法对不对呢?

对的,你可以比较下两个结果。

https://zhidao.baidu.com/question/941928895315894012.html

ans[y] == 0 || i < ans[y]这条语句表达的思路很清晰,没有问题,如果去掉i<ans[y] 仍然是对的
比如101和92是103的生成元,写代码有时不是为了简便而简便,也是为了表达清晰的思路,i<ans[y]
就是表达选取最小生成元的思路,只不过在枚举过程中由于从小到大枚举,可以不用展现i<ans[y]