文章目录
- 一、题目
- 1、原题链接
- 2、题目描述
- 二、解题报告
- 1、思路分析
- 2、时间复杂度
- 3、代码详解
- 三、知识风暴
一、题目
1、原题链接
5307. 小苹果
2、题目描述
二、解题报告
1、思路分析
思路参考y总:y总讲解视频
(1)根据题目可以分析出:每次取走的苹果数为n/3上取整个。
(2)由于每次都取走每三个苹果中的第一个,所以可以分析得出:当编号为n的苹果,也就是最后一个苹果处于最后一组三个苹果中的第一个时,它在该时候被取走(即n%3==1时)。
(3)根据题目及思路进行模拟即可。
2、时间复杂度
时间复杂度为O(logn)
3、代码详解
#include <iostream>
#include <cmath>
using namespace std;
int main () {
int n;
cin >> n;
int cnt = 0; //记录当前天数
bool flag = false; //记录编号为n的苹果是否被拿走
int ans = 0; //记录编号为n的苹果第几天被拿走
while (n) {
cnt++;
//n % 3 == 1时是编号为n的苹果被拿走的时候
if (!flag && n % 3 ==1){
ans = cnt;
flag = true;
}
//每次拿走的苹果数是n/3上取整的结果
n -= ceil((double)(n) / 3);
}
cout << cnt << ' ' << ans;
return 0;
}
三、知识风暴
- 上、下取整函数
- 头文件
#include <cmath>
- 上取整函数:
double ceil(double x);
- 下取整函数:
double floor(double x);
- 参考博文:这里,感谢博主分享!