引言
今天我们来分析洛谷P7909"分糖果"问题,这是一个看似简单但蕴含数学智慧的编程题目。通过这个问题,我们可以学习如何将实际问题转化为数学模型,并用简洁的代码实现。
一、问题重述
幼儿园有n个小朋友,你要从L到R范围内选择拿k块糖。分糖规则是:每次所有小朋友各拿1块糖,直到剩余糖果少于n块,这些剩余糖果就是你的奖励。目标是最大化这个奖励数量。
二、数学建模
分糖过程分析:
每次分糖相当于减去n的倍数
最终剩余糖果数就是k mod n
问题转化:
原问题转化为:在[L,R]区间内找到k,使得k mod n最大
关键观察:
最大余数是n-1
如果区间包含n的倍数,就能取到n-1
三、算法设计
基本情况:
如果R mod n等于n-1,直接取n-1
一般情况:
比较R mod n和(L到R区间内可能的最大余数)
边界处理:
确保n≥2
处理L=R的特殊情况
四、实现解析
输入处理:
读取n,L,R三个参数
核心计算:
计算R mod n
判断区间是否跨越n的倍数
输出结果:
根据判断输出最大余数
五、代码实现
#include <iostream>using namespACe std;int main() {
int n, L, R;
cin >> n >> L >> R;
// 计算R mod n的最大可能值
int max_mod = R % n;
// 计算最大的可能余数
if (R / n > L / n) {
// 如果R和L不在同一个n的倍数区间内,最大余数就是n-1
cout << n - 1 << endl;
} else {
// 否则最大余数就是R mod n
cout << max_mod << endl;
}
return 0;}