题目链接:https://www.luogu.com.cn/problem/P2953
#include<bits/stdc++.h>
using namespace std;
bool f[1000005];//f[i]:表示数字为i的时候,Bessie 能否赢
int n,x;
bool check(int x,int in){
if(x>1000000)return 0;//防止越界
int Min=10,Max=0;
while(x){
if(x%10) Min=min(Min,x%10),Max=max(Max,x%10);//更新最大值和最小值
x/=10;
}
return (Min==in||Max==in);//最大或最小的数等于add
}
int main(){
for(int i=0;i<=1000000;++i){
if(f[i]) continue;//原本能赢的数字,就不用再演算一遍了-------节约时间
for(int add=1;add<=9;++add){//枚举
if(check(i+add,add)) f[i+add]=true;//如果可以由i得到i+add,就可以更新f[i+add]
}
}
cin>>n;
for(int i=1;i<=n;++i){
cin>>x;
if(f[x]) puts("YES");
else puts("NO");//之前已经预处理好了,直接输出就行了
}
}