求在區間[L,R]中“荒謬度”最小的數.
貪心。每次在當前數的十進制最後一位+1,如果荒謬度更小則更新答案.
好菜啊。。
#include<bits/stdc++.h>
#define LL long long
#define clr(x,i) memset(x,i,sizeof(x))
using namespace std;
LL a,b,lv[13];
inline LL cal(int x)
{
int len=log10((double)x)+1,ret;
while(x%10LL==0){
len--;x/=10LL;
}
ret=len*2;
if(x%10LL==5LL)ret--;
return ret;
}
void add(LL &x)
{
int k=0;
while(x%lv[k+1]==0)k++;
x+=lv[k];
}
int main()
{
int cas;scanf("%d",&cas);
lv[0]=1;
for(int i=1;i<=11;i++)
lv[i]=lv[i-1]*10LL;
while(cas--)
{
scanf("%lld%lld",&a,&b);
LL minv,ans,tmp;
ans=a;minv=cal(a);
//printf("%d\n",minv);
while(1)
{
add(a);tmp=cal(a);
if(a>b)break;
if(tmp<minv)
minv=tmp,ans=a;
}
printf("%lld\n",ans);
}
return 0;
}