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

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

时间:2024-10-05 15:14:56浏览次数:1  
标签:10 打擂台 12 int 最大值 arr 小朋友 糖果 最值

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≤n R≤R R−L≤RL
1 2 5 5
2 5 10 10
3 10^3 10^3 10^3
4 10^5 10^5 10^5
5 10^3 10^9 0
6 10^3 10^9 10^3
7 10^5 10^9 10^5
8 10^9 10^9 10^9
9 10^9 10^9 10^9
10 10^9 10^9 10^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)

标签:10,打擂台,12,int,最大值,arr,小朋友,糖果,最值
From: https://www.cnblogs.com/myeln/p/18447851

相关文章

  • 【STC15】单片机中常说的 1T 和 12T 的意思
    标准51单片机是12T的,就是说12个时钟周期(晶振周期,例如12M的,周期是1/12M,单位秒),机器做一个指令周期,刚好就是1/12M*12=1us,常见指令例如_nop_就是一个周期,刚好1us,其他的大多多于一个周期,乘除法更多。所以如果计算指令时间可以这样算。而现在51核的单片机工艺质量上去后,频率大大提高,增......
  • Leetcode 1283. 使结果不超过阈值的最小除数
    1.题目基本信息1.1.题目描述给你一个整数数组nums和一个正整数threshold,你需要选择一个正整数作为除数,然后将数组里每个数都除以它,并对除法结果求和。请你找出能够使上述结果小于等于阈值threshold的除数中最小的那个。每个数除以除数后都向上取整,比方说7/3=3,10/......
  • [Ynoi2012] NOIP2015 充满了希望
    [Ynoi2012]NOIP2015充满了希望题意给一个长为\(n\)的序列,有\(m\)个操作,操作编号从\(1\)到\(m\),每个操作为:1xy:将序列位置为\(x,y\)的两个元素交换。2lrx:将序列区间\([l,r]\)内所有元素修改为\(x\)。3x:查询序列\(x\)位置的值。现在有\(q\)次查询,每次......
  • 20222312 2024-2025-1 《网络与系统攻防技术》实验一实验报告
    1.1实验目标本次实践的对象是一个名为pwn1的linux可执行文件。该程序正常执行流程是:main调用foo函数,foo函数会简单回显任何用户输入的字符串。该程序同时包含另一个代码片段,getShell,会返回一个可用Shell。正常情况下这个代码是不会被运行的。我们实践的目标就是想办法运行这......
  • 125.785 S1  Binary Model practice
    125.785S12024-- Assignment 2 (Part A and Part B)Duedate:18th October2024Theassignmentis30%tothecourseassessment, including two parts:PartA. Practice binary and paneldata regressions (15%), Part B.Critical Reading (15%).......
  • 「杂题乱刷2」CF1227D2
    题目链接CF1227D1OptimalSubsequences(HardVersion)*1600CF1227D2OptimalSubsequences(HardVersion)*1800解题思路本篇题解分D1,D2两个部分来写。D1sol:我们容易发现有以下两点性质:要想子序列和最大,必须选择前\(k\)大的数字。比第\(k\)大的数字还要大......
  • 征程6 NV12 理论与代码详解
    1.引言使用地平线征程6算法工具链进行模型部署时,如果你的模型输入是图像格式,通常会遇到如下信息。对于初学者,可能会存在一些疑问,比如:nv12是什么?明明算法模型是一个输入,为什么看hbm模型,有y和uv两个输入?为什么uv的validshape不是(1,224,224,2),而是(1,112,112,2)s......
  • 南沙C++信奥赛陈老师解一本通题 1270:【例9.14】混合背包
    ​ 【题目描述】一个旅行者有一个最多能装V公斤的背包,现在有n件物品,它们的重量分别是W1,W2,...,Wn,它们的价值分别为C1,C2,...,Cn。有的物品只可以取一次(01背包),有的物品可以取无限次(完全背包),有的物品可以取的次数有一个上限(多重背包)。求解将哪些物品装入背包可使这些物品的费用总......
  • Debuggers 1012:Introductory GDB
    OpenSecurityTraining2LearningPaths:VulnerabilityHunting&Exploitationpython:https://www.learnpython.org/路径图:https://ost2.fyi/OST2_LP_Vulns_Exploits.pdfDebuggers1012:IntroductoryGDB(与python)-->Architecture1001:x86-64Assembly-->R......
  • 《如 何 速 通 一 套 题》12.0
    别问我为什么没有11.0。补完了1002的题我就更11.0。邮寄开场秒掉AC,用了1h。然后开始看B,死磕了B2h之后磕不动了,然后看D。D忽略了一个关键信息,100->0...挂大分了。100+40+75+0=200。A旋律的总数可以固定第一个元素为\(1\)(因为其他的情况会重掉)。然后答案就......