信息学奥赛复赛复习12-CSP-J2021-01分糖果-模运算、余数、打擂台求最值、最大值、最小值

news2024/10/5 16:07:58
PDF文档回复:20241005

**1 P7909 [CSP-J 2021] 分糖果 **

[题目描述]

红太阳幼儿园有 n 个小朋友,你是其中之一。保证 n≥2

有一天你在幼儿园的后花园里发现无穷多颗糖果,你打算拿一些糖果回去分给幼儿园的小朋友们

由于你只是个平平无奇的幼儿园小朋友,所以你的体力有限,至多只能拿 R 块糖回去

但是拿的太少不够分的,所以你至少要拿 L 块糖回去。保证 n≤L≤R

也就是说,如果你拿了 k块糖,那么你需要保证 L≤k≤R

如果你拿了 k 块糖,你将把这 k 块糖放到篮子里,并要求大家按照如下方案分糖果:只要篮子里有不少于 n 块糖果,幼儿园的所有 n 个小朋友(包括你自己)都从篮子中拿走恰好一块糖,直到篮子里的糖数量少于 n 块。此时篮子里剩余的糖果均归你所有——这些糖果是作为你搬糖果的奖励

作为幼儿园高质量小朋友,你希望让作为你搬糖果的奖励的糖果数量(而不是你最后获得的总糖果数量!)尽可能多;因此你需要写一个程序,依次输入 n,L,R,并输出你最多能获得多少作为你搬糖果的奖励的糖果数量

[输入格式]

输入一行,包含三个正整数 n,L,R,分别表示小朋友的个数、糖果数量的下界和上界

[输出格式]

输出一行一个整数,表示你最多能获得的作为你搬糖果的奖励的糖果数量

[输入输出样例]

输入 #1

7 16 23

输出 #1

6

输入 #2

10 14 18

输出 #2

8

说明/提示

拿 k=20 块糖放入篮子里

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

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

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

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

数据规模

测试点n≤nR≤RR−L≤RL
1255
251010
310^310^310^3
410^510^510^5
510^310^90
610^310^910^3
710^510^910^5
810^910^910^9
910^910^910^9
1010^910^910^9

2 相关知识点

1) 模运算

模运算,就是取余数,在计算机语言中用%来表示。举个简单的例子,3 % 5 = 3。结果的取值范围在 0 与模之间

例如

c=x/y

c=3 mod 5 =3 c的取值范围 [0,y-1]

结果也可以用负数表示,即 c=-2

2) 打擂台求最大值

打擂台法求最大值是一种简单直观的方法,用于在C语言中找出数组中的最大值

基本思想

初始化一个“擂主”(即假设的最大值),通常设为数组的第一个元素。

遍历数组中的其余元素,与“擂主”进行比较。

如果当前元素比“擂主”大,则将当前元素设为新的“擂主”。

遍历结束后,“擂主”即为数组中的最大值。

这种方法易于理解和实现,且效率较高,时间复杂度为O(n),其中n为数组的长度

示例程序

#include <stdio.h>
/*
  arr[] 在arr 求数组最大值 数组arr长度为n
  a[0] 作为最开始擂主 
*/ 
int findMax(int arr[], int n) {
    int max = arr[0]; // 初始化擂主为数组的第一个元素
    for (int i = 1; i < n; i++) { // 从数组的第二个元素开始遍历
        if (arr[i] > max) { // 如果当前元素比擂主大
            max = arr[i]; // 更新擂主为当前元素
        }
    }
    return max; // 返回最大值
}

int main() {
    int arr[] = {3, 5, 1, 8, 2};
    int n = sizeof(arr) / sizeof(arr[0]); // 计算数组长度
    int maxValue = findMax(arr, n);
    printf("数组中的最大值为:%d\n", maxValue);
    return 0;
}
/*
输出
数组中的最大值为:8 
*/

3 思路分析

思路1

如果糖果比n大就分给其他小朋友,其实自己只能留下不能被分的余数个糖果

从L~R求出每个数的余数,然后求余数的最大值

示例程序

#include<bits/stdc++.h>
using namespace std;
/*
maxN 求最大,赋值一个最小数
n个小朋友
L最少L个糖果
R最多R个糖果
cur 枚举时临时变量,比较使用 
*/
int maxN=-1,n,L,R,cur;
/*
  L~R之间的数字逐一取模取最大 
*/ 
int main(){
	cin>>n>>L>>R;//输入n个小朋友 L糖果的下界 R糖果的上界 
	for(int i=L;i<=R;i++){//从下届枚举到上界 
		cur=i%n;//取模 
		if(cur>maxN){//找出所有取模后的最大值 
			maxN=cur;
		}
	}
	cout<<maxN;
	return 0;
} 

由于本题测试数据比较大,可以达到10^9,打擂台求最大值的时间复杂度为O(n),会超时,具体如下

思路2

如果糖果比n大就分给其他小朋友,其实自己只能留下不能被分的余数个糖果

分析余数可知,L~R的范围有1种情况

L~R的范围,在n范围内,即 R-L<n

此时余数最大为R%n,剩余糖果的数量为R%n

L~R的范围,大于n,R-L>n

次数余数最大为余数的最大值n-1,剩余糖果的数量为n-1

#include<bits/stdc++.h>
using namespace std;
/*
  分情况讨论
  如果在同周期,取上界和人数取模 
  例如 n=6 L=7 R=11 ,则分糖果最大数11%6=5 
  如果在不同周期,为总人数-1 
  例如 n=6 L=10 R=13,则分糖果最大数6-1=5 对应11%6=5 
*/ 
int n,L,R;//n个小朋友 L最少L个糖果 R最多R个糖果

int main(){
	cin>>n>>L>>R;//输入n个小朋友 L糖果的下界 R糖果的上界 
	if(L/n==R/n){//如果在同周期
		cout<<R%n;//取上界和人数取模 
	}else{//如果跨周期 
		cout<<n-1;//为总人数-1 
	}
	return 0;
}

时间复杂度为模运算,O(1)

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2190145.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【数学分析笔记】第4章第4节 复合函数求导法则及其应用(2)

4. 微分 4.4 复合函数求导法则及其应用 【例4.4.3】 y e 1 cos ⁡ x ye^{\sqrt{1\cos x}} ye1cosx ​&#xff0c;求 y ′ y y′ 【解】 y ′ e 1 cos ⁡ x ⋅ 1 2 1 cos ⁡ x ⋅ ( − sin ⁡ x ) − sin ⁡ x 2 1 cos ⁡ x e 1 cos ⁡ x ye^{\sqrt{1\cos x}}\cdot\f…

【LeetCode】每日一题 2024_10_5 完成旅途的最少时间(二分答案)

前言 每天和你一起刷 LeetCode 每日一题~ 大家国庆节快乐呀~ LeetCode 启动&#xff01; 突然发现&#xff0c;国庆的每日一题&#xff0c;不是坐公交就是坐火车&#xff0c;不是坐火车就是做飞机&#xff0c;这就是你的国庆旅游计划吗&#xff01;力扣&#xff01; 题目&a…

今日凌晨,ChatGPT重磅更新!—— 我心目中的终极AGI界面

今日凌晨&#xff0c;ChatGPT重磅更新&#xff01;—— 我心目中的终极AGI界面 我心目中的终极 AGI 界面是一张空白画布&#xff08;canvas&#xff09;。 今日凌晨&#xff0c;OpenAI 发布 canvas&#xff0c;一个与 ChatGPT 合作写作和编程的新界面&#xff01; canvas&…

Linux基于CentOS学习【进程状态】【进程优先级】【调度与切换】【进程挂起】【进程饥饿】

目录 进程状态 状态决定了什么 进程等待方式——队列 进程状态的表现 挂起状态 基于阻塞的挂起——阻塞挂起 swap分区 进程状态表示 Z僵尸状态 进程的优先级 什么是进程的优先级 为什么会有进程的优先级 进程饥饿 Linux的调度与切换 切换 调度 queue [ 140 ]&am…

模拟算法(3)_Z字形变换

个人主页&#xff1a;C忠实粉丝 欢迎 点赞&#x1f44d; 收藏✨ 留言✉ 加关注&#x1f493;本文由 C忠实粉丝 原创 模拟算法(3)_Z字形变换 收录于专栏【经典算法练习】 本专栏旨在分享学习算法的一点学习笔记&#xff0c;欢迎大家在评论区交流讨论&#x1f48c; 目录 1. 题目链…

VGG原理与实战

VGG网络结构 这也更好的块状结构,256个卷积核 卷积就是我们的一个特征图啊往往都会缩小 &#xff0c;然后的话但它通道不会变.卷积一般是使用我们的通道C变大,磁化但是它的通道就是我们那个H和W一般都会变小.下采样的意思就是使分辨率变小 vgg—block内的卷积层都是同结构的意…

【杂谈二之Relay继电器】介绍Relay继电器的概念、原理、分类以及实例应用

一、Relay是什么 Relay就是一个电控制的开关 二、Relay的工作原理 宏观上看主要由两部分电路组成&#xff0c;左侧的电路是低电流电路&#xff0c;右侧是高电流电路 左侧是由线圈绕制成&#xff0c;当有电流通过时就会产生磁场&#xff0c;会对于电枢产生吸引&#xff0c;由于…

【cpp/c++ summary 工具】 vcpkg 包管理器

由于之前的Hunter 包管理器在Boost的构建中速度太慢&#xff0c;准备尝试一下vcpkg。 vcpkg是由microsoft开发的、适用于 Windows、Linux 和 MacOS 的 C 库管理器。 1. 安装 vcpkg&#xff1a; 普通安装 C:\windows\system32>git clone https://github.com/microsoft/vcp…

华为 HCIP-Datacom H12-821 题库 (32)

&#x1f423;博客最下方微信公众号回复题库,领取题库和教学资源 &#x1f424;诚挚欢迎IT交流有兴趣的公众号回复交流群 &#x1f998;公众号会持续更新网络小知识&#x1f63c; 1.当一个运行 MSTP 协议的交换设备端口收到一个配置BPDU 时&#xff0c;会与设备保存的全局配…

20241005给荣品RD-RK3588-AHD开发板刷Rockchip原厂的Android12时使用iperf3测网速

20241005给荣品RD-RK3588-AHD开发板刷Rockchip原厂的Android12时使用iperf3测网速 2024/10/5 14:06 对于荣品RD-RK3588-AHD开发板&#xff0c;eth1位置上的PCIE转RJ458的以太网卡是默认好用的&#xff01; PCIE TO RJ45&#xff1a;RTL8111HS 被识别成为eth0了。inet addr:192.…

华为OD机试 - 最大连续文件之和(Python/JS/C/C++ 2024 E卷 200分)

华为OD机试 2024E卷题库疯狂收录中&#xff0c;刷题点这里 专栏导读 本专栏收录于《华为OD机试真题&#xff08;Python/JS/C/C&#xff09;》。 刷的越多&#xff0c;抽中的概率越大&#xff0c;私信哪吒&#xff0c;备注华为OD&#xff0c;加入华为OD刷题交流群&#xff0c;…

1.资源《Arduino UNO R3 proteus 仿真工程》说明。

资源链接&#xff1a; Arduino UNO R3 proteus 仿真工程 1.文件明细&#xff1a; 2.文件内容说明 包含&#xff1a;proteus工程、原理图、仿真程序。 3.内容展示 4.简述 该文件为proteus工程&#xff0c;用于Arduino uno r3仿真。 因为软件自动运行&#xff0c;所以最小…

深度学习每周学习总结J1(ResNet-50算法实战与解析 - 鸟类识别)

&#x1f368; 本文为&#x1f517;365天深度学习训练营 中的学习记录博客&#x1f356; 原作者&#xff1a;K同学啊 | 接辅导、项目定制 目录 0. 总结1. 设置GPU2. 导入数据及处理部分3. 划分数据集4. 模型构建部分5. 设置超参数&#xff1a;定义损失函数&#xff0c;学习率&a…

c++结构体嵌套

没有很听懂这个课 有点乱了、 // // Created by 徐昌真 on 2024/10/5. // #include <iostream> using namespace std; int main() {struct Point{ //定义一个叫做point的结构体double x, y;};struct Radius{Point pt; //嵌套point结构体在radius结构体里面 把他名字定…

网络威胁情报技术的进步

网络威胁形势不断演变&#xff0c;必然导致防御者和攻击者之间持续展开军备竞赛。幸运的是&#xff0c;网络威胁情报 (CTI) 技术的进步为安全专业人员提供了强大的工具&#xff0c;使他们能够保持领先地位。 本指南深入探讨了 CTI 的最新进展&#xff0c;让您了解这些技术如何…

设计模式之桥接模式(Bridge)

一、桥接模式介绍 桥接模式(bridge pattern) 的定义是&#xff1a;将抽象部分与它的实现部分分离&#xff0c;使它们都可以独立 地变化。 桥接模式用一种巧妙的方式处理多层继承存在的问题&#xff0c;用抽象关联来取代传统的多层继承&#xff0c; 将类之间的静态继承关系转变为…

【CKA】十四、监控pod的日志

14、监控pod的日志 1. 考题内容&#xff1a; 2. 答题思路&#xff1a; 查看名字是foobar的pod的日志&#xff0c;过滤出 unable-to-access-website&#xff0c;导入到文件中就可以&#xff0c;这道题还是挺简单的 3. 官网地址&#xff1a; https://kubernetes.io/zh-cn/doc…

dll动态库加载失败导致程序启动报错以及dll库加载失败的常见原因分析与总结

目录 1、问题说明 2、dll库的隐式加载与动态加载 2.1、dll库的隐式加载 2.2、dll库的显式加载 3、使用Process Explorer查看进程加载的dll库信息以及动态加载的dll库有没有加载成功 3.1、使用Process Explorer查看进程加载的dll库信息 3.2、使用Process Explorer查看动态…

警惕!脑出血前这8大预警信号,你不可不知!

在这个快节奏的时代&#xff0c;健康成为了我们最宝贵的财富之一。然而&#xff0c;突如其来的疾病往往让人措手不及&#xff0c;尤其是像脑出血这样的严重疾病&#xff0c;其发病急、进展快&#xff0c;若不及时识别并就医&#xff0c;后果不堪设想。今天&#xff0c;我们就来…

在登陆功能中添加Redis缓存

目录 基于Redis实现短信登录 实现流程图 实现代码 解决登录状态刷新问题 初始方案思路&#xff1a; 实现代码 发送验证码 登陆实现 如果是新用户则自动创建 运行测试 基于Redis实现短信登录 实现流程图 实现代码 Overridepublic Result login(LoginFormDTO loginForm…