题目描述
$today我去水题解$
[CSP-J 2023] 小苹果
题目描述
小 Y 的桌子上放着 $n$ 个苹果从左到右排成一列,编号为从 $1$ 到 $n$。
小苞是小 Y 的好朋友,每天她都会从中拿走一些苹果。
每天在拿的时候,小苞都是从左侧第 $1$ 个苹果开始、每隔 $2$ 个苹果拿走 $1$ 个苹果。随后小苞会将剩下的苹果按原先的顺序重新排成一列。
小苞想知道,多少天能拿完所有的苹果,而编号为 $n$ 的苹果是在第几天被拿走的?
输入格式
输入的第一行包含一个正整数 $n$,表示苹果的总数。
输出格式
输出一行包含两个正整数,两个整数之间由一个空格隔开,分别表示小苞拿走所有苹果所需的天数以及拿走编号为 $n$ 的苹果是在第几天。
样例 #1
样例输入 #1
8
样例输出 #1
5 5
提示
【样例 $1$ 解释】
小苞的桌上一共放了 $8$ 个苹果。
小苞第一天拿走了编号为 $1$、$4$、$7$ 的苹果。
小苞第二天拿走了编号为 $2$、$6$ 的苹果。
小苞第三天拿走了编号为 $3$ 的苹果。
小苞第四天拿走了编号为 $5$ 的苹果。
小苞第五天拿走了编号为 $8$ 的苹果。
【样例 $2$】
见选手目录下的 apple/apple2.in 与 apple/apple2.ans。
【数据范围】
对于所有测试数据有:$1\leq n\leq 10^9$。
测试点 | $n\leq$ | 特殊性质 |
---|---|---|
$1\sim 2$ | $10$ | 无 |
$3\sim 5$ | $10^3$ | 无 |
$6\sim 7$ | $10^6$ | 有 |
$8\sim 9$ | $10^6$ | 无 |
$10$ | $10^9$ | 无 |
特殊性质:小苞第一天就取走编号为 $n$ 的苹果。
去年9月刚学循环,连CCF是什么都不知道
这题可以先打暴力QwQ~~
首先把每隔3个拿掉,used数组标记一下即可
约瑟夫问题一道$ing$
#include<bits/stdc++.h>
using namespace std;
int n,a[10000005],k,sum;//a就是used数组
int main()
{
cin>>n;
while(1)
{
bool flag=1;
int cnt=1;//由于不足,cnt开始变1
for(int i=1;i<=n;i++)
{
if(a[i]==0)
cnt++;
if(cnt==2)
{
if(i==n) k=sum+1;
a[i]=1;
flag=0;
cnt=-1;//后变-1
}
}
if(flag) break;
sum++;
}
cout<<sum<<" "<<k;
}
得分90
接下来优化
找规律发现每次拿掉n/3个(上取整)
如果n%3=1,则拿掉第n个
注意
n可能多次%3=1,只记录第一次!!!
代码如下:
#include<bits/stdc++.h>
using namespace std;
int n,ans,res;
int main()
{
scanf("%d",&n);
while(n)
{
ans++;
if(n%3==1&&!res) res=ans;
if(n%3==0) n-=n/3;
else n-=n/3+1;
}
printf("%d %d",ans,res);
}