C0213 等腰直角三角形 题解
初中数学给我整红了。
这里不难发现,因为硬性要求斜边平行 \(x\) 轴,所以只会有两种情况。
同时我们想到,在坐标系中,我们可以直接用 \(y = -x + b\) 和 \(y = x + a\) 来表示这两种等腰直角三角形的直角边,此时问题就转为了求出这两种情况中的这两个函数。
这里我们转换式子为:
\[b = y+x, \ a = y-x
\]
因为要包含所有的点,所以我们是一定要取最大的和最小的(因为有两种情况),这个我们可以直接在输入的时候解决。同时,我们要根据最上面的 \(y\) 坐标和最下面的 \(y\) 坐标来确定两条斜边的 \(y\) 坐标。
最后就是数学计算斜边的长,取个 \(\min\)。
#include <bits/stdc++.h>
#include <climits>
using namespace std;
#define ll long long
#define ull unsigned long long
#define pii pair <int, int>
void solve () {
int n; cin >> n;
// vector <pii> po;
int maxa = INT_MIN, maxb = INT_MIN, minb = INT_MAX, mina = INT_MAX;
int miny = INT_MAX, maxy = INT_MIN;
for (int i = 0;i < n;i++) {
int x, y;
cin >> x >> y;
int a = y-x, b = y+x;
maxa = max(maxa, a), maxb = max(maxb, b);
mina = min(mina, a), minb = min(minb, b);
miny = min(miny, y), maxy = max(maxy, y);
}
ll suma = (maxb - miny) - (miny - maxa),
sumb = (maxy - mina) - (minb - maxy);
cout << min(suma, sumb) << "\n";
}
int main () {
freopen("triangle.in", "r", stdin);
freopen("triangle.out", "w", stdout);
ios::sync_with_stdio(false);
cin.tie(nullptr), cout.tie(nullptr);
int _ = 1;
while (_--) solve();
return 0;
}
浙公网安备 33010602011771号