zcmu 2013 Reflection(思维)

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/qq_41117236/article/details/82985993

【题目】

Reflection

【题意】

定义一个函数把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); 
        } 
    } 
} 

猜你喜欢

转载自blog.csdn.net/qq_41117236/article/details/82985993