csp-j2023小苹果 AI题解 洛谷原题

**根据搜索结果,以下是CSP-J 2023 小苹果题解的几种方法:

  1. 非递归方法 这种方法使用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;
}
  1. 递归方法 这种方法使用递归模拟拿苹果的过程。定义变量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;
}
  1. 另一种递归方法 这种方法同样使用递归,但是更详细地描述了递归过程中的每一步操作,包括如何更新苹果数量和记录编号为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 条评论

  • 1