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;
}
相关推荐
星星.72225 分钟前
【图论】最小生成树|Prim+Kruskal算法
数据结构·c++·算法·图论
_Narcissus_40 分钟前
单调栈笔记及例题详解
数据结构·c++·笔记·算法·力扣·单调栈·洛谷
土司大王9 小时前
LeetCode hot100——对称二叉树
算法·leetcode·职场和发展
sali-tec9 小时前
C# 基于OpenCv的视觉工作流-章106-差值追踪
图像处理·人工智能·opencv·算法·计算机视觉
Navigator_Z9 小时前
LeetCode //C - 1208. Get Equal Substrings Within Budget
c语言·算法·leetcode
手写码匠9 小时前
Dify 多 Agent 工具权限与安全沙箱实战:让智能体“有能力,但不越权“
人工智能·深度学习·算法·aigc
黎阳之光9 小时前
打破堆场感知黑盒:黎阳之光视频孪生,构建港口码头网格化透明管控新体系
大数据·人工智能·算法·安全·数字孪生
大模型码小白10 小时前
AI 对话流性能调优:万级消息的虚拟滚动落地
java·大数据·前端·javascript·人工智能·算法·机器学习