想一下会发现,末尾数字0肯定是越多越好,但是数据范围比较大,挨个遍历肯定不行,所以就要记录一下当前计算的这个数字i末尾有几个0,例如当前价格末尾有3个0,遍历的时候下一个价格直接选取i+1000进行计算;
然后计算荒谬度的时候,最后一位数字为5时处理一下即可。
AC代码:
#include<iostream>
#include<cstdio>
#include<iomanip>
#include<cstdlib>
#include <algorithm>
#include<string.h>
#include<math.h>
#define llu unsigned long long
using namespace std;
llu next(llu x)//看应该跳过多少数字
{
llu num=1;
while(x%10==0){
x/=10;
num*=10;
}
return num;
}
llu rid(llu x)//计算荒谬度
{
while(x%10==0){
x/=10;
}
int len=0,p=x%10;
while(x){
x/=10;
len++;
}
return len*2-(p==5);
}
int main()
{
int T;
cin >> T ;
while(T--)
{
int ridmin=21;
llu l,r,ans;
cin >> l >> r ;
for(llu i=l;i<=r;i+=next(i))
{
if(rid(i)<ridmin)
{
ridmin=rid(i);
ans=i;
}
}
cout << ans << endl ;
}
return 0;
}