B - DIV + MOD(数学 + 贪心)

题意:

面对T组数据

每一组数据给定 l , r , a

返回对区间[l,r]求f[x] = x / a + x % a的最大值的结果

Sample 1

InputcopyOutputcopy
 

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;
}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值