题解:B4350 [信息与未来 2025] 美味水果

· · 题解

B4350 [信息与未来 2025] 美味水果

题解

本题是一道很好的递归练习题。

题意:给定 n,下面 n 个数,代表初始的水果好吃度。随后每天吃一个水果,剩下水果好吃度在第二天变成前一天的

首先定义一个变量 $n$,然后定义数组,输入数组的量: ``` int n; cin>>n; int a[n+1]; for(int i=1;i<=n;i++){ cin>>a[i]; } ``` 然后在定义一个函数: ``` bool cmp(int x,int y){ return x>y; } ``` 作用是让 $sort$ 函数从大到小排。 ``` sort(a+1,a+n+1,cmp); ``` 接着定义一个递归函数: ``` int xxx(int xx,int yy){ int num=xx; int o=yy; num=sqrt(num); o--; if(num==1) return num; if(o==1) return num; else xxx(num,o); } ``` 因为已经排序完毕,所以只需要把第 $i$ 个数开根 $i$ 次就可以了。 注意:需特判 $num$ 是否等于 $1$。 其中 $num$ 是用来开根的,$o$ 是用来记录次数。 ``` int sum=a[1]; for(int i=2;i<=n;i++){ a[i]=xxx(a[i],i); sum+=a[i]; } ``` $sum$ 是用来把最大的好吃度加起来。 完整代码: ``` #include<bits/stdc++.h> //万能头 using namespace std; bool cmp(int x,int y){ return x>y;//从大到小排 } int xxx(int xx,int yy){ int num=xx; int o=yy;//次数 num=sqrt(num);//开根 o--; if(num==1) return num;//特判 if(o==1) return num; //判断次数是否到了 else xxx(num,o); } int main(){ int n; cin>>n; int a[n+1]; for(int i=1;i<=n;i++){ cin>>a[i];//输入 } sort(a+1,a+n+1,cmp); int sum=a[1]; for(int i=2;i<=n;i++){ a[i]=xxx(a[i],i); sum+=a[i];//加和 } cout<<sum;//输出 return 0;//圆满完成 } ```