戒告后人,永远不要忘记删除注释!!
你们肯定都是看标题进来的吧,本人在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个是那一天拿走的。
先看数据范围
| 测试点 | 特殊性质 | |
|---|---|---|
| 无 | ||
| 无 | ||
| 有 | ||
| 无 | ||
| 无 |
特殊性质:小苞第一天就取走编号为
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;
}