戒告后人,永远不要忘记删除注释!!

· · 题解

你们肯定都是看标题进来的吧,本人在2023CSP-J中未删用来注释freopen的注释符,本人自罚写一篇题解也为戒告后人。

我的freopen:


//freopen("apple.in",r,stdin);
//freopen("apple.out",w,stdout);

正解


freopen("apple.in",r,stdin);
freopen("apple.out",w,stdout);

P9748

2023CSP—J T1:小苹果

模拟+数学

题目传送门

题目大意

小Y有n个苹果,小苞是小 Y 的好朋友,每天她都会从小Y那拿走一些苹果。每天第一个必须拿,往后隔两个拿一个,直到不能拿为止后将没拿的从新排序,问你第几天可以全部拿完所有的和第n个是那一天拿走的。

先看数据范围

测试点 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 的苹果。

1.特殊性质暴力写法(20分)

特殊性质为:小苞第一天就取走编号为 n 的苹果。所以我们可以只算出小苞什么时候能把所有的苹果拿完,因为他是每两个拿一个,那我们就是让他三个为一周期,所以我们拿的数量是len_a/3,但是我们每天第一个都要拿,所以要改为1+(len_a-1)/3,代码如下:

#include<bits/stdc++.h>
using namespace std;
int n,nas,len_a,day,ans=0;
int main(){
    cin>>n;
    len_a=n;
    for(int i=1;i<=n;i++){
        nas=1+(len_a-1)/3;len_a-=nas;
        if(!ans&&len_a%3==1)ans=i;
        if(len_a==0){
            day=i;
            break;
        }

    }

    cout<<day<<" "<<1;
    return 0;

} 
//特殊样例暴力写法:20分

2.100分写法(模拟+数学)

100分写法就要将没有特殊性质的数据给它过了,也就是第n个不是第一天拿到的。如何判断呢?这里就要运用到各位的数学才华了,不讲了直接上代码。

#include <bits/stdc++.h>
using namespace std;
int n, ans, num;
int main(){
cin >> n;
while (n) {
ans++;
if (n % 3 == 1 && !num)num = ans;
n = n - (n + 2) / 3;
}
cout << ans << ' ' << num << '\n';
return 0;
}