信息学奥赛复赛复习18-CSP-J2023-01小苹果-向上取整、向下取整、模拟算法

news/2024/10/21 18:27:12
PDF文档公众号回复关键字:20241021

1 P9748 [CSP-J 2023] 小苹果

[题目描述]

小 Y 的桌子上放着 n 个苹果从左到右排成一列,编号为从 1 到 n。

小苞是小 Y 的好朋友,每天她都会从中拿走一些苹果。

每天在拿的时候,小苞都是从左侧第 1 个苹果开始、每隔 2 个苹果拿走 1 个苹果。随后小苞会将剩下的苹果按原先的顺序重新排成一列。

小苞想知道,多少天能拿完所有的苹果,而编号为 n 的苹果是在第几天被拿走的?

[输入格式]

输入的第一行包含一个正整数 n,表示苹果的总数

[输出格式]

输出一行包含两个正整数,两个整数之间由一个空格隔开,分别表示小苞拿走所有苹果所需的天数以及拿走编号为 n 的苹果是在第几天

[输入输出样例]

输入 #1

8

输出 #1

5 5

说明/提示

小苞的桌上一共放了 8 个苹果。
小苞第一天拿走了编号为 1、4、7 的苹果。
小苞第二天拿走了编号为 2、6 的苹果。
小苞第三天拿走了编号为 3 的苹果。
小苞第四天拿走了编号为 5 的苹果。
小苞第五天拿走了编号为 8 的苹果。

数据规模

对于所有测试数据有:1≤n≤10^9

测试点 n≤n 特殊性质
1∼2 10
3∼5 10^3
6∼7 10^6
8∼9 10^6
10 10^9

2 相关知识点

1) 向上取整

数学符号
⌈ ⌉ 
⌈x⌉ 向上取整符号 表示大于等于 x 的最小的整数例如
⌈13/3⌉=5

2) 向下取整

数学符号
⌊ ⌋
⌊x⌋ 向下取整符号 表示小于等于 x 的最大的整数例如
⌊13/3⌋=4

3 思路分析

思路1-数组模拟

模拟拿苹果的过程
1 按3个一组把苹果分成若干组,每次取每组的第1个苹果,取完苹果打标识,标识此苹果已经被拿
2 从新把剩余苹果分组,按1重新拿,指导拿完

以8个苹果为例子,具体拿的过程如下
1 拿每组(3个)的第1个,拿走1,4,7位置的苹果

2 继续拿每组(3个)的第1个,拿走2,6位置的苹果

3 继续拿每组(3个)的第1个,拿走3位置的苹果

4 继续拿每组(3个)的第1个,拿走5位置的苹果

5 继续拿每组(3个)的第1个,拿走8位置的苹果,第8个苹果,是第5天拿走的

示例程序

#include<bits/stdc++.h>
using namespace std;
const int N=1e6;//90%测试用例满足
/*
a[N]模拟数组,每个苹果放入数组的1个位置,开始为0,如果拿走设置为1
n个苹果
cnt 每一天遍历时 剩余苹果对应的位置
temp 还剩余的苹果数
days 第几天拿苹果
ndays 第n个苹果是第几天拿 
*/ 
int a[N],n,cnt,temp,days,ndays; 
int main(){cin>>n;//输入苹果数n temp=n;//暂存一份n,拿去后直接从temp上面减去,n保持不变 while(temp){//如果剩余还有苹果 需要继续取苹果 days++;//新的一天拿苹果 cnt=0;//还剩余苹果遍历时从1开始的位置 for(int i=1;i<=n;i++){//重新遍历一遍 if(a[i]==1) continue;//如果此位置苹果已经被拿走,继续拿下一个 cnt++;//拿当前苹果 if(cnt%3==1){//每3个苹果拿第1个 a[i]=1;//标识此苹果已经被拿走 temp--;//剩余苹果少1个 if(i==n){//如果本次拿的是第n个苹果,记录是第几天 ndays=days;//记录第n个苹果是days天拿走的 }}}}cout<<days<<" "<<ndays;//输出总共拿了几天苹果和第n个苹果是第几天拿走的 return 0;
}

思路2

1 计算每天拿走的苹果数,3个1组,计算方法当前剩余苹果数和3取余向上取整
例如
剩余1个苹果可以拿走1个:⌈1/3⌉=1
剩余2个苹果可以拿走1个:⌈2/3⌉=1
剩余3个苹果可以拿走1个:⌈3/3⌉=1
剩余4个苹果可以拿走2个:⌈4/3⌉=2
2 直到拿完为止单独计算第几天拿走第n个苹果
1 由于3个1组,每次拿走第1个,所以当剩余苹果中,n为每3个1组中的第1个时,第n个苹果为拿走
2 拿走第n个苹果结束,输出对应第几天

示例程序

#include<bits/stdc++.h>
using namespace std;
/*n输入n个苹果x临时变量 每1天拿完苹果后还剩余苹果的数量days1 第1次模拟第几天拿苹果days2 第2次模拟第几天拿苹果 
*/ 
int n,x,days1,days2; 
int main(){cin>>n;//输入苹果数n x=n;//x初始为n //计算几天拿完苹果 while(x){//还剩余苹果 进入循环拿苹果 days1++;//天数加1 x=x-(x+2)/3;//本次拿苹果数位剩余苹果数/3向上取整 }cout<<days1<<" ";//几天拿完苹果 //计算第几天拿第n个苹果 while(true){//一直循环 等待break退出 days2++;//记录是第几天拿苹果 if(n%3==1) break;//如果第days天,n可以被拿走 则退出 n=n-(n+2)/3;//不能被拿走,总数去除第days2天拿走的苹果,继续对剩余的苹果继续拿 }cout<<days2;//输出第n个苹果第days2天拿走 return 0;
}

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

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

相关文章

多校A层冲刺NOIP2024模拟赛10

因为有好多人没有好好打,所以我认为我垫底了。 赛时rank 2,T1 0pts,T2 100pts,T3 0pts,T4 40pts,accoder上同分,rank 9。 T1 因为没输出挂了5pts,T4 爆搜挂了5pts,乐。 update:T3没有启发式合并被卡成rank 4了 神:wang5是下一个zh0ukangyang 岛屿 唐氏的推柿子题。 …

13、Linux网络管理

网络基本概念 物理地址/逻辑地址物理地址:硬件地址,如MAC地址。 逻辑地址:软件配置地址,如IP地址。网卡作用:连接计算机和网络的硬件设备。MAC地址 (Media Access Control)定义:媒体访问控制地址,唯一标识网络设备的硬件地址。IP地址 (Internet Protocol Address)格式示…

CSS速刷 - CSS动画

作用:引起注意、愉悦感、反馈、掩饰(加载过程)transition动画 补间动画,中间过程可以计算出来。transition: width 1s:意味动画属性是width,动画时间是1秒。delay: 动画延迟几秒再开始 transition-timing-function 缓动函数:可以自己定制。关键帧动画 animationanimation…

五款实用报表工具推荐:从山海鲸到 JasperReports,哪个更适合你?

概述 在现代数据驱动的商业环境中,选择一款合适的报表工具对于企业的决策制定和数据管理至关重要。本文将为您介绍五款各具特色的免费或开源报表工具,包括国内的山海鲸报表、开源的 Superset、云端友好的 Looker Studio 以及企业级的 Zoho Analytics 和 JasperReports。本文将…

数据库运维实操优质文章文档分享(含Oracle、MySQL等) | 2024年9月刊

本文为大家整理了墨天轮数据社区2024年9月发布的优质技术文章/文档,主题涵盖Oracle、MySQL、PostgreSQL等主流数据库系统以及国产数据库的技术实操,欢迎参考。本文为大家整理了墨天轮数据社区2024年9月发布的优质技术文章/文档,主题涵盖Oracle、MySQL、PostgreSQL等主流数据…

物理理机中没有VMNet1和VMNet8虚拟网卡,网络不通

主机ping不通虚拟机网络控制面板——网络连接——网络适配器 VMware Network Adapter VMnet1 VMware Network Adapter VMnet8 如果没有这两个虚拟网卡,虚拟机的网络会出现问题 # 解决办法-恢复虚拟网卡默认设置 1、下载并打开ccleaner,ccleaner官网:CCleaner Makes Your Com…

Linux_进程理解、状态与优先级(详细版)

1.进程的概念 课本概念:程序的一个执行实例,正在执行的程序等。 内核观点:担当分配系统资源(CPU时间,内存)的实体。 其实:进程=内核的相关管理数据结构(task_struct、页表等)+程序的代码和数据task_struct:是描述进程的结构体,是Linux内核的一种数据结构,它会被装载…

12、用户和权限管理

用户组与用户管理 用户组(Group) 用户组用于方便权限分配。 常见部门组:北京核心 研究院-教研中心-北京教学部 研究院-研发中心-长沙研发 研究院-售后VIP服务中心 研究院-教研中心-长沙教学部组ID(GID)分类:root用户组:GID=0 程序用户组(系统用户组):1-999 (CentOS7)…