题目大意:有一个定义域为
[l,r]
的函数f
记录x(先除去末尾的0)的长度为l,若x最后一位为5则f(x)=2l-1,否则为2l
求f(x)的最小值
题解:贪心,每次将最后一位非0数字+1
我的收获:
#include<bits/stdc++.h>
using namespace std;
#define ll long long
int read()
{
int x=0,f=1;char ch=getchar();
while(ch<'0'||ch>'9'){if(ch=='-')f=-1;ch=getchar();}
while(ch>='0'&&ch<='9'){x=x*10+ch-'0';ch=getchar();}
return x*f;
}
int T,l,r,ans,mi;
int add(int x)
{
int k=1;
while(x%10==0) k*=10,x/=10;
return k;
}
int cal(int x)
{
while(x%10==0) x/=10;
int t=x%10,len=0;
while(x) x/=10,len++;
if(t==5) return 2*len-1;
return 2*len;
}
void work()
{
l=read(),r=read();
mi=cal(l);ans=l;
while(1)
{
l+=add(l);
if(l>r) break;
int t=cal(l);
if(t<mi) mi=t,ans=l;
}
printf("%d\n",ans);
}
int main()
{
T=read();
while(T--) work();
return 0;
}