从L开始从小到大暴力枚举。考虑到最后是让非零前缀数字个数最少,那么下面枚举的不可能在当前数的某个后缀零上变动。
于是每次将最后一位不是0的数字+1并统计答案即可。
每一位最多加了10次,一次是9的复杂度,最多9位,故复杂度O(810T)。
1 #include<cstdio> 2 #include<cstring> 3 #include<algorithm> 4 #define rep(i,l,r) for (int i=(l); i<=(r); i++) 5 using namespace std; 6 7 int T,l,r,ans,mn; 8 9 int add(int x){ 10 int k=1; 11 while (x%10==0) k*=10,x/=10; 12 return k; 13 } 14 15 int cal(int x){ 16 while (x%10==0) x/=10; 17 int t=x%10,a=0; 18 while (x) x/=10,a++; 19 if (t==5) return 2*a-1; else return 2*a; 20 } 21 22 int main(){ 23 freopen("bzoj4029.in","r",stdin); 24 freopen("bzoj4029.out","w",stdout); 25 for (scanf("%d",&T); T--; ){ 26 scanf("%d%d",&l,&r); mn=cal(l); ans=l; 27 while (1){ 28 l+=add(l); 29 if (l>r) break; 30 int t=cal(l); 31 if (t<mn) mn=t,ans=l; 32 } 33 printf("%d ",ans); 34 } 35 return 0; 36 }