分糖果C++

题目:


样例解释:

样例1解释

拿 k=20 块糖放入篮子里。

篮子里现在糖果数 20≥n=7,因此所有小朋友获得一块糖;

篮子里现在糖果数变成 13≥n=7,因此所有小朋友获得一块糖;

篮子里现在糖果数变成 6<n=7,因此这 6 块糖是作为你搬糖果的奖励

容易发现,你获得的作为你搬糖果的奖励的糖果数量不可能超过 6 块(不然,篮子里的糖果数量最后仍然不少于 n,需要继续每个小朋友拿一块),因此答案是 6。

样例2解释

容易发现,当你拿的糖数量 k 满足 14=L≤k≤R=18 时,所有小朋友获得一块糖后,剩下的 k−10 块糖总是作为你搬糖果的奖励的糖果数量,因此拿 k=18 块是最优解,答案是 8。


思路:

70分思路:

暴力枚举 [l,r][l,r] 中的每一个整数并统计答案。

100分思路:

取余运算的两个简单性质:

(大概是小学知识吧)

  1. nn 对任何正整数取余的结果都在 [0,n−1][0,n−1]范围内

  2. 若 x mod n=yxmodn=y,则 (x+n) mod n=y(x+n)modn=y

因此我们能知道:

若 r−l+1≥nr−l+1≥n,则 [0,n−1][0,n−1] 中的每个正整数都能在 [l,r][l,r]中的正整数对 nn 取余的结果中找到,此时答案为 n−1n−1

若 r−l+1<nr−l+1<n,则再分类讨论:

若 l mod n≤r mod nlmodn≤rmodn,如下图

此时能取到的数的范围为上图的红色部分,这时答案为 r mod nrmodn

注意: 这里的分类是 l mod n≤r mod n l mod n≤r mod n,而非 l  mod  n<r  mod n l mod n<r mod n

若 l  mod  n>r  mod n lmod n>r mod n,如下图

此时能取到的数的范围为上图的红色部分,这时答案为 n−1


代码:

cpp 复制代码
#include<iostream>
#include<cstdio>
using namespace std;

int n,l,r;

int main(){
	cin>>n>>l>>r;
	if(l/n==r/n) cout<<r%n;
	else cout<<n-1;
	return 0;
}

总结:

此题解题关键为分类讨论,必须贯彻不重不漏的原则,否则有可能出错

相关推荐
weixin_4461224631 分钟前
JAVA内存区域划分
java·开发语言·redis
悦悦子a啊33 分钟前
Python之--基本知识
开发语言·前端·python
QuantumStack1 小时前
【C++ 真题】P1104 生日
开发语言·c++·算法
天若有情6732 小时前
01_软件卓越之道:功能性与需求满足
c++·软件工程·软件
whoarethenext2 小时前
使用 C++/OpenCV 和 MFCC 构建双重认证智能门禁系统
开发语言·c++·opencv·mfcc
代码的奴隶(艾伦·耶格尔)2 小时前
后端快捷代码
java·开发语言
Jay_5153 小时前
C++多态与虚函数详解:从入门到精通
开发语言·c++
路来了3 小时前
Python小工具之PDF合并
开发语言·windows·python
xiaolang_8616_wjl4 小时前
c++文字游戏_闯关打怪
开发语言·数据结构·c++·算法·c++20
WJ.Polar4 小时前
Python数据容器-list和tuple
开发语言·python