C语言网-蓝桥杯省赛:爬山为什么不能拿满

#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,并进行特别处理也不对,并且得分更低。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值