造房子 \operatorname{造房子} 造房子
题目链接: luogu P6784 \operatorname{luogu\ P6784} luogu P6784
题目背景
pigstd 要去造房子了。
题目
pigstd 有 a a a 个 A 材料和 b b b 个 B 材料,造第 i i i 层楼需要 i i i 个 A 材料与 i i i 个 B 材料。
但是 pigstd 觉得房子不够高,于是他拿出了 c c c 块钱,每块钱都可以用来买 1 1 1 个 A 材料或者 1 1 1 个 B 材料。
现在 pigstd 想知道,他最多能建多少层楼的房子。
输入
第一行三个整数 a , b , c a,b,c a,b,c。
输出
一行一个整数,表示 pigstd 最多能建多少层楼的房子。
样例输入1
1 2 3
样例输出1
2
样例解释1
pigstd 买 2 2 2 个 A 材料和 1 1 1 个 B 材料后就有 3 3 3 个 A 材料和 3 3 3 个 B 材料,最多可以建 2 2 2 层楼的房子。
(花费 1 + 2 1+2 1+2 个 A 材料和 1 + 2 1+2 1+2 个 B 材料)
样例输入2
1 5 3
样例输出2
2
样例解释2
pigstd 买 3 3 3 个 A 材料后就有 4 4 4 个 A 材料和 5 5 5 个 B 材料,最多可以建 2 2 2 层楼的房子。
(花费 1 + 2 1+2 1+2 个 A 材料和 1 + 2 1+2 1+2 个 B 材料)
数据范围
对于 100 % 100\% 100% 的数据, 0 ≤ a , b , c ≤ 1 0 12 0 \le a,b,c \le 10^{12} 0≤a,b,c≤1012。
数据点编号 | 满足的条件 |
---|---|
1 − 4 , 22 1-4,22 1−4,22 | c = 0 c = 0 c=0 |
5 − 8 , 21 5-8,21 5−8,21 | a , b , c ≤ 1 0 3 a,b,c \le 10^{3} a,b,c≤103 |
9 − 12 9-12 9−12 | a , b , c ≤ 1 0 6 a,b,c \le 10^{6} a,b,c≤106 |
13 − 20 13-20 13−20 | a , b , c ≤ 1 0 12 a,b,c \le 10^{12} a,b,c≤1012 |
思路
这道题就暴力模拟。
就从小到大枚举房子的高度,然后算出 A 材料和 B 材料要补充多少件,如果两个要补充的数量加起来超过了 c c c,那就不能盖这么高,输出当前的高度 − 1 -1 −1。
代码
#include<cstdio>
#include<iostream>
#define ll long long
using namespace std;
ll a, b, c, ans, now;
ll an, bn;
int main() {
scanf("%lld %lld %lld", &a, &b, &c);
while (1) {
ans++;
now += ans;
an = max((ll)0, now - a);
bn = max((ll)0, now - b);
if (an + bn > c) {
ans--;
printf("%lld", ans);
return 0;
}
}
return 0;
}