D-现在是,学术时间 (II)_2023牛客寒假算法基础集训营1 (nowcoder.com)
给一个矩形 和一个点 , 再找一个点与 组成另一个矩形, 求 的最大值。
为了让并集面积尽量小, 新点的选择要从矩形的边中选, 这样就可以直接枚举。然后根据枚举出的点计算两个矩形的交集面积和并集面积求解即可。
并集面积可以在求出交集面积后, 将两个矩形面积相加再减去交集面积。 求交集面积需要先找出 即两个矩形左侧边的最小值, 右侧边的最大值, 上侧边的最小值, 下侧边的最大值。然后再求面积。
#include <bits/stdc++.h>
using namespace std;
int x,y,a,b;
int main()
{
std::ios::sync_with_stdio(false);
std::cin.tie(nullptr);
std::cout << std::fixed << std::setprecision(10) << "\n";
int T;
cin >> T;
while(T--)
{
double ans = 0;
cin >> x >> y >> a >> b;
for(auto c : {0,x})
for(auto d : {0,y})
{
int xl = max(0, min(a,c));
int xr = min(x, max(a,c));
int yl = max(0, min(b,d));
int yr = min(y, max(b,d));
int inner = abs(xl - xr) * abs(yl - yr);
int uni = x*y + abs(a-c)*abs(b-d) - inner;
double res = 1. * inner / uni;
ans = max(res, ans);
}
cout << ans << "\n";
}
return 0;
}