刚读完题目就想到可以开两个vector数组来直接模拟的,然后看了眼数据范围果断放弃。
然后手动模拟了一下发现取苹果的位置是有一定规律的,只要苹果的位置(注意不是苹果的编号)模$ 3 $为$ 1 $,当前苹果就可以取的到。那么题目问编号为$ n $的苹果问什么时候取到就是说编号为$ n $的苹果什么时候在当前剩余苹果中的位置模$ 3 $为$ 1 $。而且有一个特殊的地方就是编号为$ n $的苹果一定是排在当前剩余苹果的最后一个(我想这也是为什么题目要问编号为$ n $的苹果,而不问其他苹果编号的原因)。例如当前剩余$ 5 $个苹果,那么编号为$ n $的苹果的位置一定是$ 5 $。那么知道了这个性质之后,那么关键的地方就是要知道当前还剩多少苹果。通过取苹果的过程可以知道是每$ 3 $个苹果中取一个苹果,那么就可以将当前苹果每$ 3 $个分为一组,每次都取每一组的第一个。如果不够分的话,那么至少还多出一个苹果,而这多出来的苹果一定会被取到一个。综上所述,假设当前剩余$ n $个苹果,如果$ n $能够被$ 3 $整除,就取$ n / 3 $个苹果,否则就取$ n / 3 + 1 $个苹果。
C++代码:
#include<iostream>
using namespace std;
int n;
int main()
{
scanf("%d", &n);
int cnt = 0, res = 0;
while(n)
{
cnt ++;
int t = (n + 2) / 3;
if(!res && n % 3 == 1) res = cnt;
n -= t;
}
printf("%d %d", cnt, res);
return 0;
}
(n+2)/3 这个是 怎么啥意思呀 怎么想到的
这是上取整的一个技巧,和ceil函数的作用差不多
哦哦 明白了 就是记住就好吗
嗯嗯对的
其实有另外一种理解,假设总共是n个苹果,每天取的所有苹果编号是3k - 2,3k - 2 <= n,计算的k表示的是本轮中拿掉了多少个苹果。