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;
}