- 分享
AI写题解:我看不懂!!!
- @ 2024-12-20 14:53:19
csp-j2023小苹果 AI题解 洛谷原题
**根据搜索结果,以下是CSP-J 2023 小苹果题解的几种方法:
- 非递归方法 这种方法使用while循环模拟拿苹果的过程。定义变量n表示初始的苹果数量,ans表示总的轮数,k表示记录第一次选中最后一个的轮数。每轮处理,轮数ans加1。如果(n - 1)能被3整除且k为0,表示选中最后一个,记录第一次选中最后一个的轮数为k。更新苹果数量,每次减去(n - 1) / 3 + 1个苹果。输出总的轮数ans和第一次选中最后一个的轮数k。
#include <iostream>
using namespace std;
int main() {
int n, ans = 0, k = 0;
cin >> n; // 输入初始的苹果数量
while (n) {
ans++; // 每轮处理,轮数加1
if ((n - 1) % 3 == 0 && k == 0) {
// 如果 (n-1) 能被 3 整除,且 k 为 0,表示选中最后一个
k = ans; // 记录第一次选中最后一个的轮数
}
n = n - ((n - 1) / 3 + 1);
// 更新苹果数量,每次减去 (n-1)/3+1 个苹果
}
cout << ans << " " << k;
// 输出总的轮数和第一次选中最后一个的轮数
return 0;
}
- 递归方法 这种方法使用递归模拟拿苹果的过程。定义变量n表示初始的苹果数量,ans2表示编号为n的苹果被拿走的天数。递归函数f中,如果n % 3 == 1,则记录编号为n的苹果被拿走的天数。如果n为0,表示苹果已经被拿完,输出答案后结束程序。
#include <bits/stdc++.h>
using namespace std;
int n,ans2;
void f(int day)
{
if(!ans2 && n % 3 == 1) ans2 = day + 1; //编号为n的苹果被拿走了
if(n == 0) //苹果被拿光,输出答案
{
cout << day << " " << ans2;
return;
}
n -= ceil(n * 1.0 / 3);
f(day + 1); //明天更美好
return;
}
int main()
{
cin >> n;
f(0); //开始递归,第0天表示刚开始的时候
return 0;
}
- 另一种递归方法 这种方法同样使用递归,但是更详细地描述了递归过程中的每一步操作,包括如何更新苹果数量和记录编号为n的苹果被拿走的天数。
#include <iostream>
#include <cstring>
#include <cstdio>
#include <algorithm>
#include <cmath>
#include <cstdlib>
using namespace std;
typedef long long ll;
int main()
{
ll n;
scanf("%lld",&n);
ll t=n,ans1=0,ans2=0;
while(t)
{
ll x=(t+2)/3;
ans1++;
if(ans2==0 && t%3==1)
ans2=ans1;
t-=x;
}
printf("%lld %lld\n",ans1,ans2);
return 0;
}
以上是几种不同的解题方法,你可以根据需要选择合适的方法来解决问题。**
这么强
2 条评论
-
汽氡 (user64) LV 5 @ 2025-12-11 9:46:50
什么东西
-
@ 2024-12-20 16:37:32啊?!
- 1