1 条题解
-
0
思路与算法
每轮删第1、4、7...个,剩余数量floor(2n/3);原最右苹果保持最右,首次当前数量模3等于1即被取走,同时继续算清空天数。
按上述模型建立状态或枚举对象,依代码中的顺序处理输入并输出完整答案。
正确性说明
每轮删除位置1模3的苹果共ceil(n/3)个,剩余floor(2n/3)。原编号n在它还未被取走时始终是序列最后一个,故本轮当且仅当当前数量为1模3时取走它;直到数量0的轮次即清空天数。
复杂度
O(log n)时间、O(1)额外空间。
易错点
不能把“每隔2个”理解为每隔1个。记录末苹果取走后仍要继续模拟人数直到0。
参考代码(C++11)
#include <bits/stdc++.h> using namespace std; int main() { long long n; cin >> n; int day = 0, last = 0; while (n) { day++; if (!last && n % 3 == 1) last = day; n -= (n + 2) / 3; } cout << day << ' ' << last << "\n"; }
- 1