极简题解
2025-08-05 22:11:22
发布于:上海
16阅读
0回复
0点赞
题目大意
从左侧第 1 个苹果开始,每隔 2 个苹果拿走 1 个苹果,将剩下的苹果按原先的顺序重新排成一列。问多少天能拿完所有的苹果,而编号为 n 的苹果是在第几天被拿走的?
思路分析
隔2个拿1个,规律为编号 % 3 == 1的拿走。一轮循环将当前这一次拿走的所有都排除,同时统计n在你% 3 == 1时被拿走,并讲n减去当前这一天拿走的个数,即 / 3 的结果
代码实现
#include<bits/stdc++.h>
#define ll long long
using namespace std;
ll n;
int main(){
freopen("apple.in","r",stdin);
freopen("apple.out","w",stdout);
cin >> n;
ll cnt = 0;//记录拿了几天
ll day = 0;//记录第几天拿到n
while(n){
cnt++;
//每循环一次,将这次拿走的个数从n中删去
//cnt记录一天
if(n % 3 == 1 && day == 0) day = cnt;
//如果 % 3 剩一个,则是将第n个(剩的那一个)拿去了
//要保证是第一次拿到n(&& day == 0);
n -= ceil(1.0 * n / 3);
//n减去它 % 3向上取整的结果
//只有当前编号 % 3 == 1时才拿走,故结果为 n / 3
//如果最后剩下2或1个时也拿走那一个,所以向上取整
}
cout << cnt << " " << day;
fclose(stdin);
fclose(stdout);
return 0;
}
这里空空如也
有帮助,赞一个