版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/qq_41117236/article/details/82985993
【题目】
【题意】
定义一个函数把n每一位上的数字x变为(9-x)得到新的数m,权值即n*m,输出[l,r]范围内的最大权值。
【思路】
可以发现1-9,10-99,100-999...的权值变化都是开口向下的二次函数,最大值即|n-m|=1的时候。
【代码】
#include <cstdio>
#include <cstdlib>
#include <cstring>
#include <cmath>
#include <cstdlib>
#include <map>
#include <list>
#include <vector>
#include <stack>
#include <queue>
#include <algorithm>
#include <iostream>
#define mem(a) memset(a,0,sizeof(a))
#define go(i,a,b) for(int i=a;i<=b;i++)
#define og(i,a,b) for(int i=a;i>=b;i--)
using namespace std;
const int maxn=1000005;
const int inf=0x3f3f3f3f;
typedef long long ll;
typedef unsigned long long ull;
ll cul(ll a)
{
int k=0,num[12];
ll sum=0,t=1;
while(a)
{
num[k++]=9-a%10;
a/=10;
}
go(i,0,k-1)
{
sum+=num[i]*t;
t*=10;
}
return sum;
}
main()
{
int l,r;
while(~scanf("%d%d",&l,&r))
{
ll x=9;
while(r>x)
{
x=x*10+9;
}
if((l<=x/2&&r>=x/2)||(l<=x/2+1&&r>=x/2+1)) printf("%lld\n",(x/2)*(x/2+1));
else
{
ll ans=max(l*cul(l),r*cul(r));
printf("%lld\n",ans);
}
}
}