CF86A 题解
题意
求 $ \max\limits_{x=l}^{r} f(x),f(x)=(\underbrace{99\cdots9}_ {\log_{10}x+1\text{个}9}-x)\times x
$。
思路
看了看题目,用我们聪明的大脑一想,$f(x)=(10^{\log_{10}x+1}-1-x)\times x=-x2-x+x\times10x+1}$,仔细一想这不就是一个开口向下的二次函数吗?于是,题目就是二次函数最值问题。
设 $cnt=10^{\log_{10}x+1}-1$
所以,函数对称轴就为 $\frac{cnt}{2}$。
因为函数开口向下,所以:
- 当 $x\in(-\infty,\frac{cnt}{2}]$,函数单调递增。
- 当 $x\in[\frac{cnt}{2},+\infty)$,函数单调递减。
- 当 $x=\frac{cnt}{2}$ 时,函数有最大值。
于是,求函数图像就可以分为以下三种情况:
- 当 $l\leqslant r<\frac{cnt}{2}$,则对于任意 $x$,有 $f(x)$ 单调递增,所以有当 $x=r$ 时,有函数最大值 $f(r)$。
- 当 $\frac{cnt}{2}<l\leqslant r$,则对于任意 $x$,有 $f(x)$ 单调递减,所以有当 $x=l$ 时,有函数最大值 $f(l)$。
- 当 $l\leqslant\frac{cnt}{2}\leqslant r$,则当 $x=\frac{cnt}{2}$ 时,函数有最大值。
于是,这题就做出来了。
总结
- 二次函数最值问题。
- 单调性。
- 分类讨论。
代码
#include<iostream>
#include<cstdio>
#include<algorithm>
#include<cstring>
#include<cmath>
using namespace std;
long long l,r,wr,cnt;
int main(){scanf("%lld %lld",&l,&r);wr=log10(r);cnt=pow(10,wr+1)-1; if(l>=cnt/2) printf("%lld",l*(cnt-l));//f(l)处值最大 else if(r<cnt/2) printf("%lld",r*(cnt-r));//f(r)处值最大 else printf("%lld",cnt/2*(cnt-cnt/2));//对称轴处f(x)最大,输出对称轴f(x)的值 return 0;
}