给出位置区间,求区间内最大值。
已知:y 是 关于 位置x 的函数
问题:求位置区间内的最大值,
算法1
算出区间内每个位置x对应的函数值y
算法2
找到函数的“单调性”
我们发现函数在某些区间内存在单调性。
为了深挖,我们将函数变为 n = k * x + y;
我们发现,
k随x的变化规律。
并发现,k相同时,第一个k对应的y值最大
按照一般经验,我们先暴力,发现找到每一个最大值的复杂度已经是On。
那么,还想要优化成O1,就只能借助单调性了。
我们发现了y与x有一定的单调性,
然后深度解析函数式,
并【逆向思维/变化角度】找到k与x有一定的单调性,k与y有一定的单调性。
此题得解
#include <iostream>
using namespace std;
const int N = 1e8;
int a[N];
int n, m;
int main()
{
cin >> n >> m;
while( m -- )
{
int l, r;
cin >> l >> r;
//求出n/r的值
int x = n / r;
//判断l是否和r在同一区间
if(n / l == x) cout << n % l << endl;
else cout << n % (n / (x + 1) + 1) << endl;
}
return 0;
}