首先,让我们来理解题目
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;
}
//李宸宇,未经允许,不得抄袭,否则将会举报。