题目描述
pigstd 有 aa 个 A 材料和 bb 个 B 材料,造第 ii 层楼需要 ii 个 A 材料与 ii 个 B 材料。
但是 pigstd 觉得房子不够高,于是他拿出了 cc 块钱,每块钱都可以用来买 11 个 A 材料或者 11 个 B 材料。
现在 pigstd 想知道,他最多能建多少层楼的房子。
输入格式
第一行三个整数 a , b , c a,b,c a,b,c。
输出格式
一行一个整数,表示 p i g s t d pigstd pigstd 最多能建多少层楼的房子。
输入输出样例
输入 #1复制
1 2 3
输出 #1复制
2
输入 #2复制
1 5 3
输出 #2复制
2
说明/提示
【样例 1 说明】
p i g s t d pigstd pigstd 买 2 个 A 材料和 1 个 B 材料后就有 3 个 A 材料和 3 个 B 材料,最多可以建 2 层楼的房子。
(花费 1 + 2 1+2 1+2 个 A 材料和 1 + 2 1+2 1+2 个 B 材料)
【样例 2 说明】
pigstd 买 3 个 A 材料后就有 4 个 A 材料和 5 个 B 材料,最多可以建 2 层楼的房子。
(花费 1 + 2 1+2 1+2 个 A 材料和 1 + 2 1+2 1+2 个 B 材料)
【数据规模与约定】
对于 100 100 100% 的数据, 0 ≤ a , b , c ≤ 1 0 1 2 0≤a,b,c≤10^12 0≤a,b,c≤1012 。
解题思路
这是一道水题。。。
你能用的材料为t,即把c分给 a a a和 b b b后的 m i n ( a , b ) min(a,b) min(a,b).
一开始预处理建每一层的房子要的材料。
求出 t t t后,枚举建几层房子,找到第一个建房子需要的材料大于 t t t的, a n s ans ans为 x − 1 x-1 x−1。
代码
#include<algorithm>
#include<iostream>
#include<cstdio>
#include<cmath>
#include<cstring>
using namespace std;
long long a,b,c,t,bsy[1000010];
int main(){
scanf("%lld%lld%lld",&a,&b,&c);
for(int i=1;i<=1000005;i++)
bsy[i]=bsy[i-1]+i;
if(a>b) swap(a,b);
if(b-a>c)
{
t=a+c;
for(int i=1;i<=1000005;i++)
{
if(bsy[i]>t)
{
printf("%d",i-1);
return 0;
}
}
}
if(b-a<=c)
{
t=(a+b+c)/2;
for(int i=1;i<=1000005;i++)
{
if(bsy[i]>t)
{
printf("%d",i-1);
return 0;
}
}
}
}