問題リンク-DIV + MOD
問題
以下の関数を考えます。
fa(x)=⌊ax⌋+xmoda
aは定数でxはl以上r以下(l≦x≦r)の時fa(x)が最大となるxを求めてください。
解法
場合分けをして考えます。
⌊al⌋=⌊ar⌋の場合
l≦x≦rの範囲で⌊ax⌋の値は変化しないのでxmodaの取りうる最大の値を求めればよいです。その値はrmodaとなります。
⌊al⌋=⌊ar⌋の場合
xをlからrへと変化させるとき、⌊ar⌋−1から⌊ar⌋へと変わる瞬間があります。この変化の直前にxmoda=a−1となり最大値の候補の1つが得られます。
もう1つの候補はx=rの時で⌊ax⌋が最大となる時なのでこの2つの候補を比較すれば良いです。
実装
#include <bits/stdc++.h>
using namespace std;
void solve(){
int l, r, a;
cin >> l >> r >> a;
if(l/a == r/a){
cout << r/a + r%a << endl;
}else{
int ans = max(r/a - 1 + a-1, r/a + r%a);
cout << ans << endl;
}
}
int main(){
int t;
cin >> t;
while(t--){
solve();
}
return 0;
}