洛谷P7909 [CSP-J 2021] 分糖果题解

1.题目链接

P7909 [CSP-J 2021] 分糖果

2.题意简述

输入n,L,R,在[L,R]中找到一个值k,使得 k mod n 值最大,并将此值输出
注:mod为取模运算符

3.样例解读

洛谷P7909 [CSP-J 2021] 分糖果题解_第1张图片

  • 样例1中,n=7,L=16,R=23,其意思为在16~23中找到一个数字k,使得 k mod n 的值最大,通过计算发现当k=20时,20 mod 7=6,则输出6,祥见下方图表
    洛谷P7909 [CSP-J 2021] 分糖果题解_第2张图片
  • 样例2中,n=10,L=14,R=18,其意思为在14~18中找到一个数字课k,使得 k mod n 的值最大,通过计算发现当k=18时,18 mod 10=8,则输出8,详见下方图表
    洛谷P7909 [CSP-J 2021] 分糖果题解_第3张图片

4.解题思路

  • 读完此题并结合样例理解题意后,可能会优先考虑暴力枚举,枚举[L,R]中的所有值,找到符合题意的结果,但需注意的是题目中的数据范围: 2 ≤ n ≤ L ≤ R ≤ 1 0 9 2\leq n\leq{L} \leq R \leq10^9 2nLR109,显然O(n)的做法不会得到满分,大约可以拿到70分左右。
  • 对于100分思路,先了解两个简单的取余运算性质(数学问题)

(1)n对任何正整数取余的的结果都在[0,n-1]范围内
(2)若a mod b=c,则一定有(a+b) mod b=c

  • 了解以上两个性质后我们结合样例可以得:

R / n > L / n R/n>L/n R/n>L/n时,结合上方性质2及性质1,我们可以得出k mod n的最大值为n-1
洛谷P7909 [CSP-J 2021] 分糖果题解_第4张图片

R / n = L / n R/n=L/n R/n=L/n时,则[L,R]中所有从小到大所有数字 mod n 是单调递增的,则 k mod n的最大值为 R mod n
洛谷P7909 [CSP-J 2021] 分糖果题解_第5张图片

5.代码体现

#include
using namespace std;

int n,l,r,a,b,c,d;

int main(){
	cin>>n>>l>>r;
	//数据预处理
	a=l/n;
	b=l%n;
	c=r/n;
	d=r%n;
	if(c>a){
		cout<<n-1; //上方所述情况一
	}
	else{
		cout<<d;  //上方所述情况二
	}
	return 0;
}

你可能感兴趣的:(算法,c++)