D.现在是,学术时间 (II)【2023牛客寒假算法基础集训营1】

D.现在是,学术时间 (II)

原题连接

题意

1.给出一个由平面上两点\((0,0),(x,y)\)所确定的GT目标框和一个点\(P(x_p,y_p)\)。请你求出在所有以P点作为其中一个顶点且边都平行于坐标轴的预测目标框中,可以使其与GT目标框取到的最大IOU为多少。

  1. 标检测任务旨在编写一个程序检测出图中存在的各种目标,每个目标可以用一个四边都平行于图像边界的矩形框来描述,我们称为目标框。而图像上完全正确的框出了目标的目标框称为GT目标框,程序所输出的目标框称为预测目标框。
  2. 为了评价程序的精确度,常常使用IOU这一标准来判断。定义两个矩形A,BA,B的IOU为两个矩形交集部分的面积除以两个矩形并集部分的面积。

思路

image

  • 另一个矩形顶点一定是ABCD之一;
  • 考虑P点坐标的四种情况,即右图四个区域
  • 区域1:枚举A、B、C、D作为另一顶点的四种情况,取最大IOU;(易证)
  • 区域3:取A作为另一顶点; (不易证)
  • 区域2:枚举A、B作为另一顶点的两种情况,选较大的IOU; (易证)
  • 区域4:枚举A、D作为另一顶点的两种情况,选较大的IOU; (易证)

代码

点击查看代码
#include<iostream>
#include<iomanip>
using namespace std;

#define prep(i,a,b) for(int i = (a); i <= (b); i ++)
#define rrep(i,a,b) for(int i = (a); i >= (b); i --)

typedef long long LL;
const char nl = '\n';
int T, n, m;
int x,y,xp,yp;


void solve() {
	cin >> x >> y >> xp >> yp;
	if(xp <= x && yp <= y)cout << fixed << setprecision(9) << 1.0 * max(y - yp,yp) * max(x - xp,xp) / (x * y) << nl;
	else if(yp > y && xp <= x)cout << fixed << setprecision(9) << 1.0 * y * max(x - xp,xp) / (x * y + (yp - y) * max(x - xp,xp))<< nl;
	else if(xp > x && yp <= y)cout << fixed << setprecision(9) << 1.0 * x * max(y - yp,yp) / (x * y + (xp - x) * max(y - yp,yp))<< nl;
	else cout << fixed << setprecision(9) << 1.0 * x * y / (xp * yp) << nl; 
}

int main() {
	ios::sync_with_stdio(false);
	cin.tie(0), cout.tie(0);

	cin >> T;
	while (T--) {
		solve();
	}

	return 0;
}

posted @ 2023-01-18 20:04  Keith-  阅读(32)  评论(0编辑  收藏  举报