CSP-J 2023 小苹果

题意理解

n个苹果从左到右排成一列。每天操作:从第 1 个开始,每隔 2 个拿走 1 个。剩下苹果保持原顺序重新排成新序列。

问两个值:

  1. 一共多少天拿完全部苹果。
  2. 原始编号为n的苹果,会在第几天被拿走。

代码拆分

整个代码可以分为两个部分,计算总天数与哪天拿n;

第一部分:总天数

cpp 复制代码
int x=n;
while(x>0)
{
	x-=(x+2)/3;
	cnt++;
}

(x+2)/3是计算今天拿走了多少个(x+2是为了向上取整)。

第二部分:哪天拿走n

cpp 复制代码
int day=0;
while(true)
{
	day++;
	if(n%3==1)
	{
		break;
	}
	n=n-ceil(n/3.0);
}

注意:这里的n不再是原始总苹果数,代表:原始编号为 n 的苹果,在当前这一轮序列里的位置

今天要拿走的是:位置满足pos%3 =1 的苹果。

如果 pos%3 ==1:这个苹果就在今天被拿走,循环结束,day 就是答案。

如果没有被拿走,它会留在序列中,需要计算它下一轮的新位置,继续下一天。

新位置 = 原位置 − 前面被拿走苹果的个数。

完整AC代码

cpp 复制代码
#include <bits/stdc++.h>
using namespace std;
int main()
{
    int n;
    cin>>n;
    //第一部分:求拿完所有苹果总天数cnt
    int x=n;
    int cnt=0;
    while(x>0)
    {
        // 本轮拿走ceil(x/3) = (x+2)/3
        x -= (x+2)/3;
        cnt++;
    }

    //第二部分:求原始编号n的苹果在哪一天被拿走
    int pos=n; // pos:该苹果在当前一轮序列的位置(1‑based)
    int day=0;
    while(true)
    {
        day++;
        if(pos%3==1) // 当前位置模3等于1,今天被拿走
        {
            break;
        }
        //没被拿走,更新为下一轮的位置
        pos = pos - ceil(pos / 3.0);
    }
    cout<<cnt<<" "<<day;
    return 0;
}
相关推荐
hanlin0344 分钟前
刷题笔记:力扣第144题-二叉树的前序遍历
笔记·算法·leetcode
金士曼1 小时前
从规则到涌现:算法认知的三个层次
算法
AgentMaster2 小时前
数据资产化落地难题:5款数据中台系统架构对比与实施记录
大数据·人工智能·算法
鹿角片ljp2 小时前
从 Kimi Cyber Reasoning 学习网络安全推理数据集:从 Reasoning SFT 到安全 Agent 数据设计
数据结构·算法
residual_fan3 小时前
航空发动机故障诊断专用智能体(三):基于对比学习的时序特征区分方法
人工智能·算法·数据挖掘·数据分析
高亦真3 小时前
今天是学习嵌入式的第39天
linux·学习·算法
Omics Pro4 小时前
AI药物研发10原则!欧盟EMA×美国FDA
数据库·人工智能·算法·机器学习·自然语言处理
wabs6664 小时前
关于二叉树【力扣100.相同的树的思考】
数据结构·c++·算法·leetcode·二叉树·递归法
知知之之4 小时前
敏感数据查询:SHA-256 还是 HMAC-SHA256
算法
彧azz4 小时前
Java学习记录:判断语句
java·笔记·学习·算法