#include<iostream>
using namespace std;
#include<algorithm>
#include<queue>
#include<math.h>
typedef long long ll;
const int N=1e5+7;
priority_queue<int> q;//用来获取队头,因为只关注最大值
int n,P,Q;
ll sum=0;
int main(){
cin>>n>>P>>Q;//P开根号,Q除2
while(n--){
int x;
cin>>x;
q.push(x);
sum+=x;//先全部加起来,这样后面不用进行多一次计算
}
//cout<<sum<<"sum\n";
while(P&&Q){//如果可以除2也可以开根号,则选择更优的
int top=q.top();
q.pop();
int t1=sqrt(top);
int t2=top/2;
if(t1<=t2){//找更小的,更省力=减去的越多
q.push(t1);
sum-=(top-t1);//top=49,t1=7,sum-=49-7
P--;
}
else{
q.push(t2);
sum-=(top-t2);//这里最好不要写成-t2,本本题默认只保留整数,直接减t2可能会造成误差
Q--;
}
//cout<<sum<<" "<<top<<" "<<t1<<" "<<t2<<"\n";
}
while(P){
int top=q.top();
int t1=sqrt(top);
q.pop();
q.push(t1);
sum-=(top-t1);
P--;
//cout<<sum<<" "<<top<<" "<<t1<<" "<<"\n";
}
while(Q){
int top=q.top();
int t2=top/2;
q.pop();
q.push(t2);
sum-=(top-t2);
Q--;
//cout<<sum<<" "<<top<<" "<<t2<<" "<<"\n";
}
cout<<sum;
}
题目链接:蓝桥杯2024年第十五届省赛真题-爬山 - C语言网 (dotcpp.com)
看了一些题解说是平方数的原因。
2 1 1
48 49
例如这组数据正常计算是7+24=31。
但应该得到的结果为6+24=30。
但我修改过特判平方数x并且下一个数是否为x-1,并进行特别处理也不对,并且得分更低。