题解:B4350 [信息与未来 2025] 美味水果
renxuyang1234
·
·
题解
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;//圆满完成
}
```