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;
}
相关推荐
Fuyo_111910 小时前
C++ AVL树保姆级详解:从平衡因子到四大旋转机制
java·c++·算法
jktantan10 小时前
每个节点 41 字节:把一棵百万节点树拆进 14 个 typed array
前端·javascript·vue.js·算法·typescript
揽星河..11 小时前
【C语言】猜数字游戏
c语言·算法·游戏
LabVIEW开发11 小时前
CTM-3 红外测温仪 + LabVIEW 温度怎么测?
算法·labview·测试·labview程序
纪念 22911 小时前
C++算法(六)
开发语言·c++·算法
Dumbness12 小时前
UIA 读微信群消息没有 id,怎么判断哪条是新的:后缀对齐在翻历史和撤回时整屏重报
python·算法
taka12 小时前
从 24x 到 141x:我用纯 Python 零依赖项目,扒开了 GPU 加速的性能黑洞
算法
UIU11413 小时前
P16237 [蓝桥杯 2026 省 B] 应急布线
数据结构·c++·算法·蓝桥杯
旖旎夜光13 小时前
LeetCode 315: 算右侧小于当前元素的个数(归并排序) —— 题解
c++·学习·算法·leetcode·排序算法
像风一样自由202013 小时前
2.如何用FastAPI把一个Python算法封装成HTTP服务
python·算法·fastapi