P6784 「EZEC-3」造房子

首先,让我们来理解题目

pigstd 有 a 个 A 材料和 b 个 B 材料,造第 i 层楼需要 i 个 A 材料与 i 个 B 材料。

但是 pigstd 觉得房子不够高,于是他拿出了 c 块钱,每块钱都可以用来买 1 个 A 材料或者 1 个 B 材料。

现在 pigstd 想知道,他最多能建多少层楼的房子。

这是从题目上照抄的,也就是说,我们要让A和B材料尽可能的均衡,才能获得最大的造房高度。所以需要一个变量来记录A和B材料加上万能材料后的最小值。

再来关注这一句话——造第 i 层楼需要 i 个 A 材料与 i 个 B 材料。也就是造第一层楼,变量-1,造第二层楼,变量-2…

所以我们得出的第一个结论为O(n)的算法。

具体代码我就不写了,相信如此简单的东西大家都会。

而第二种解法为O(1)的算法,具体为——把i看成一个单调性的等差数列,已知和,求项数。那么便有了一个我自己总结的公式——

	long long k=(int)sqrt(s);
	if (k*(k+1)>s) return k-1;
	else return (long long)sqrt(s);

然后我们再把这个公式带入到代码里去——

#include<bits/stdc++.h>
using namespace std;
long long xs(long long s){
	long long k=(int)sqrt(s);
	if (k*(k+1)>s) return k-1;
	else return (long long)sqrt(s);
}
int main(){
	long long a,b,c;
	scanf("%lld%lld%lld",&a,&b,&c);
	long long h=abs(a-b);
	if (c>=h){
		c-=h;printf("%lld\n",xs((max(a,b)+c/2)*2));
	}else{
		printf("%lld\n",xs((min(a,b)+c)*2));
	}
	return 0;
} 
//李宸宇,未经允许,不得抄袭,否则将会举报。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值