题解:[ABC385F] Visible Buildings
看起来很难,实际上是一道简单的初中数学题。学过一次函数(雾)的都应该会做。
注意点:初二(好像是)学的一次函数
赛时分析(有改动)
题目告诉我们,一个位置
不妨用数学语言表达:建筑
学过一次函数的都知道,
我们说建筑
也就是说:
对于所有
因此,为了使所有建筑物可见,
我们来模拟一下第一个样例。
所以,最大值
赛时代码
#include <bits/stdc++.h>
#define int long long
using namespace std;
int n;
double maxh = - 1e18;
pair <int, int> h[200010];
signed main() {
ios :: sync_with_stdio(false);
cin . tie(nullptr);
cin >> n;
for (int i = 1; i <= n; i ++) cin >> h[i] . first >> h[i] . second; // 输入
for (int i = 2; i <= n; i ++) {
// 注意需要从第二个开始,因为取的是相邻的
int X_1 = h[i] . first, H_1 = h[i] . second;
int X_2 = h[i - 1] . first, H_2 = h[i - 1] . second;
// 这里分别表示出相邻的两栋楼
maxh = max(maxh, (double)(H_2 * X_1 - H_1 * X_2) / (double)(X_1 - X_2));
// 求斜率并取最大值
}
if (maxh < 0) cout << "-1" << endl;
// 无解
else cout << fixed << setprecision(12) << maxh << endl;
// 输出结果
return 0;
}
完结撒花,记得点赞 [嘿嘿]。