跳到主要内容
212 词数1 分钟

题解:P9748 [CSP-J 2023] 小苹果

题意简述

nn 个苹果排成一列。每天从左起第 11 个开始、每隔 22 个拿走 11 个(即拿走第 1,4,7,1,4,7,\dots 个),剩下的按原顺序重排。求拿完所有苹果的天数,以及编号 nn(最右)的苹果在第几天被拿走。

解题思路

某天剩 nn 个苹果时,拿走的是位置 1,4,7,1,4,7,\dots,共 n/3\lceil n/3\rceil 个,剩 2n/3\lfloor 2n/3\rfloor 个。每天约去掉三分之一,故 O(logn)O(\log n) 天就能拿完,直接模拟天数即可。

最右的苹果始终在末位,那天它的位置就是当前剩余个数 nn,因此它被拿走当且仅当 n1(mod3)n\equiv1\pmod 3。模拟中第一次遇到 nmod3=1n\bmod 3=1 的那天,就是它被拿走的日子。

n/3=(n+2)/3\lceil n/3\rceil=\lfloor(n+2)/3\rfloor 避免浮点。

时间复杂度为 O(logn)O(\log n)

参考代码

250 Bcpp
#include <bits/stdc++.h>
using namespace std;

int main()
{
ios::sync_with_stdio(false);
cin.tie(nullptr);
int n;
cin>>n;
int day=0,ans=0;
while(n)
{
day++;
if(!ans&&n%3==1)ans=day;
n-=(n+2)/3;
}
cout<<day<<' '<<ans<<'\n';
return 0;
}