洛谷 P9748 [CSP-J 2023] 小苹果 题解
这题是一道简单的模拟题。
我们可以使用两个变量 cntd 和 d 分别表示拿走所有苹果所需的天数以及拿走编号为 \(n\) 的苹果是在第几天。
由题意可知,对于每次拿苹果都是拿 \(1\) 个,不拿 \(2\) 个,拿 \(1\) 个,不拿 \(2\) 个……所以我们可以把拿的 \(1\) 个和不拿的 \(2\) 个分为一组,可以得出每次所拿的苹果的编号 \(\%3=1\)。
于是我们可以模拟每次拿苹果的过程。先判断第 \(n\) 个苹果是否被拿走,如果还没被拿走,就判断本次会不会拿走(判断是否 \(\%3=1\)),如果本次被拿走,d=cntd(cntd 为当前天数)。
接着再减去本次拿走的苹果,因为可能出现最后一组苹果不完整的情况,所以 \(n\) 应该减去 \((n+2)\div3\)。
#include<iostream>
#include<cstdio>
using namespace std;
int n,cntd,d;
int main()
{
scanf("%d",&n);
while(n)//判断苹果是否拿完
{
cntd++;//天数加1
if(!d&&n%3==1) d=cntd;//如果第n个苹果没被拿过且本次会被拿,则标记
n-=(n+2)/3;//减去本次拿走的苹果
}
printf("%d %d",cntd,d);
return 0;
}

浙公网安备 33010602011771号