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;
}
相关推荐
yi01111 小时前
LeetCode 219:存在重复元素 II——哈希表记录“最近一次出现的位置”
数据结构·人工智能·笔记·python·算法·leetcode·哈希表
灯澜忆梦14 小时前
【面向对象编程C++】| 基础语法
java·c++·算法
小蒋观天下14 小时前
专项方案:大场景港口AI安防、多干扰环境下的算法调优与落地实操
人工智能·深度学习·算法·安全·机器学习·计算机视觉·ai大模型
Evand J14 小时前
【电机滤波例程5】渐消因子自适应扩展卡尔曼滤波(EKF),MATLAB。PMSM负载突变下的状态估计。附下载链接
算法·matlab
H.莓飛14 小时前
【数据结构】二叉树_OJ题
linux·开发语言·数据结构·算法
好想像大佬一样能够ak所有15 小时前
Leetcode35.搜索插入位置
数据结构·算法·leetcode
aqiu11111115 小时前
【C++算法打怪专栏】LeetCode 165. 比较版本号(双指针与字符串流法)
c++·算法·leetcode
黄金龙PLUS15 小时前
如何基于置换算法来设计对称加密算法
算法·网络安全·密码学·哈希算法·同态加密
不会就选b15 小时前
算法日常・每日刷题--<动态规划>14
算法
赛博守夜人15 小时前
跨境业务与出海合规之九:海外买量投放与营销虚假流量(Ad Fraud):跨国机房群控与归因欺诈识别算法
算法·安全