【LGR-075 洛谷 8 月月赛 II Div.2】 T1 造房子【数学】

题目描述
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 0a,b,c1012


解题思路
这是一道水题。。。
你能用的材料为t,即把c分给 a a a b b b后的 m i n ( a , b ) min(a,b) min(a,b).

  1. a b s ( a − b ) < c abs(a-b)abs(ab)<c时,你把c分给 a a a b b b,你能用的材料为 ( a + b + c ) / 2 (a+b+c)/2 (a+b+c)/2;
  2. a b s ( a − b ) > = c abs(a-b)>=c abs(ab)>=c时,你把c都给 m i n ( a , b ) min(a,b) min(a,b),你能用的材料为 m i n ( a , b ) + c min(a,b)+c min(a,b)+c

一开始预处理建每一层的房子要的材料。
求出 t t t后,枚举建几层房子,找到第一个建房子需要的材料大于 t t t的, a n s ans ans x − 1 x-1 x1
【LGR-075 洛谷 8 月月赛 II Div.2】 T1 造房子【数学】_第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;
			}
		}
	}
}

你可能感兴趣的:(数学,洛古)