定义一个数的“荒谬度”为:这个数去除末尾0后的十进制长度p*2,如果此时末尾为5则为p*2-1.
求在区间[L,R]中“荒谬度”最小的数.
贪心。每次在当前数的十进制最后一位+1,如果荒谬度更小则更新答案.
求在区间[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;
}