题意:
面对T组数据
每一组数据给定 l , r , a
返回对区间[l,r]求f[x] = x / a + x % a的最大值的结果
Sample 1
Inputcopy | Outputcopy |
---|---|
5 1 4 3 5 8 4 6 10 6 1 1000000000 1000000000 10 12 8 | 2 4 5 999999999 5 |
Note
In the first sample:
- �3(1)=⌊13⌋+1mod3=0+1=1f3(1)=⌊31⌋+1mod3=0+1=1,
- �3(2)=⌊23⌋+2mod3=0+2=2f3(2)=⌊32⌋+2mod3=0+2=2,
- �3(3)=⌊33⌋+3mod3=1+0=1f3(3)=⌊33⌋+3mod3=1+0=1,
- �3(4)=⌊43⌋+4mod3=1+1=2f3(4)=⌊34⌋+4mod3=1+1=2
As an answer, obviously, �3(2)f3(2) and �3(4)f3(4) are suitable.
#include<bits/stdc++.h>
#define endl '\n'
using namespace std;
//求f[x] = x / a + x % a 的最大值
long long ans;
void slove()
{
int l, r, a;
cin >> l >> r >> a;
//如果左边界和右边界在除法操作得到的值相当且左边界值>=a
//那么最大值应该依靠 % 来得到,例如[4,7]对于a = 4求值
//因为4 / 4 == 7 / 4 而此时这种情况求 % 得到的值在[l,r]区间单调递增== >> 最大值当且仅当 x == r时取得
//反之:如果不满足以上特殊情况,我们想要最后得到的f[x] == maxnum
//那么我们希望 / 和 % 得到的结果都趋向各自操作的最大值
//其中 / 操作的最终值在[l,r]区间单调递减 ==>> 我们希望x尽量小
//同时我们又希望 % 操作最终值最大 == > 即 % 操作得到的结果为 a - 1 == >> x == r / a - 1;
//则我们在 r / a - 1 位置 和 r 位置之间取最大项即可
l / a == r / a ? ans = r / a + r % a : ans = max(r / a + r % a,((r / a) - 1) + a - 1);
cout << ans << endl;
}
int main()
{
cin.tie(0) -> sync_with_stdio(false);
int t;
cin >> t;
while (t--)
slove();
return 0;
}