[CSP-J 2021] 分糖果 题解
题目描述
红太阳幼儿园有 n n n 个小朋友,你是其中之一。保证 n ≥ 2 n \ge 2 n≥2。
有一天你在幼儿园的后花园里发现无穷多颗糖果,你打算拿一些糖果回去分给幼儿园的小朋友们。
由于你只是个平平无奇的幼儿园小朋友,所以你的体力有限,至多只能拿 R R R 块糖回去。
但是拿的太少不够分的,所以你至少要拿 L L L 块糖回去。保证 n ≤ L ≤ R n \le L \le R n≤L≤R。
也就是说,如果你拿了 k k k 块糖,那么你需要保证 L ≤ k ≤ R L \le k \le R L≤k≤R。
如果你拿了 k k k 块糖,你将把这 k k k 块糖放到篮子里,并要求大家按照如下方案分糖果:只要篮子里有不少于 n n n 块糖果,幼儿园的所有 n n n 个小朋友(包括你自己)都从篮子中拿走恰好一块糖,直到篮子里的糖数量少于 n n n 块。此时篮子里剩余的糖果均归你所有——这些糖果是作为你搬糖果的奖励。
作为幼儿园高质量小朋友,你希望让作为你搬糖果的奖励的糖果数量(而不是你最后获得的总糖果数量!)尽可能多;因此你需要写一个程序,依次输入 n , L , R n, L, R n,L,R,并输出你最多能获得多少作为你搬糖果的奖励的糖果数量。
题目分析
首先 第一种方法就是暴力枚举,找到一个mod n的最大值。
时间复杂度 O(r-l+1),70分
另外一种算法就可以 O(1) 过
我们考虑如果 l mod n+(r−l) 小于 n 的话,我们就直接取他们两个分别 mod n的最大值
如果大于 n 的话,显然我们模 n 已经经过了 [1,n-1]的每一个值,所以我们直接输出n−1 即可。
代码
#include<bits/stdc++.h>
using namespace std;
int n,l,r;
int main(){
cin>>n>>l>>r;
if(r/n==l/n)
{
cout<<r%n<<endl;
}
else
{
cout<<n-1<<endl;
}
return 0;
}
//freopen("ans.in","r",stdin);
//freopen("ans.out","w",stdout);
//cout<<fixed<<setprecision(2)<<c;