CSP-J 2023 小苹果

CSP-J 2023 小苹果 题意理解n个苹果从左到右排成一列。每天操作从第 1 个开始每隔 2 个拿走 1 个。剩下苹果保持原顺序重新排成新序列。问两个值一共多少天拿完全部苹果。原始编号为n的苹果会在第几天被拿走。代码拆分整个代码可以分为两个部分计算总天数与哪天拿n第一部分总天数intxn;while(x0){x-(x2)/3;cnt;}(x2)/3是计算今天拿走了多少个x2是为了向上取整。第二部分哪天拿走nintday0;while(true){day;if(n%31){break;}nn-ceil(n/3.0);}注意这里的n不再是原始总苹果数代表原始编号为 n 的苹果在当前这一轮序列里的位置今天要拿走的是位置满足pos%3 1 的苹果。如果 pos%3 1这个苹果就在今天被拿走循环结束day 就是答案。如果没有被拿走它会留在序列中需要计算它下一轮的新位置继续下一天。新位置 原位置 − 前面被拿走苹果的个数。完整AC代码#includebits/stdc.husingnamespacestd;intmain(){intn;cinn;//第一部分求拿完所有苹果总天数cntintxn;intcnt0;while(x0){// 本轮拿走ceil(x/3) (x2)/3x-(x2)/3;cnt;}//第二部分求原始编号n的苹果在哪一天被拿走intposn;// pos该苹果在当前一轮序列的位置1‑basedintday0;while(true){day;if(pos%31)// 当前位置模3等于1今天被拿走{break;}//没被拿走更新为下一轮的位置pospos-ceil(pos/3.0);}coutcnt day;return0;}