解题报告+优化——试题 基础练习 矩形面积交——16行代码AC
程序员文章站
2024-03-19 12:21:34
...
励志用少的代码做高效的表达。
心路历程:
第一阶段:
最初想独立AC出这题来着,但考虑来考虑去,总觉得没想到点子上,缺点什么似的。于是搜网,果不其然,是一种全新的算法“线段交”。当然这是简化版的。 下面说一下判断线段交的方法;
线段交:
先判断两个矩形是否相交,如果不相交直接输出0。反之,则输出4个横坐标中中间两个横坐标值之差, 4个纵坐标中中间两个纵坐标值之差。(好有道理啊有木有)
好大一坨知识!学习了!
第二阶段:
明确思路后,对题的重心就从解出变成了优化。 最开始定义了八个变量,分别表示(x1,y1)、(x2,y2)、(xi,yi)、(xj,yj),但后来发现这样判断大小太麻烦,索性将所有值存入数组,用algorithm中sort对数组进行排序操作,十分方便、整洁。
传送门→懒癌的福音——algorithm头文件函数全集。
注意点:
1、别忘了计算范围是实数,最开始搞成了整数,看测试用例时才发现。
2、输入时第一个坐标可能是矩形四个点中任意一点,第二个坐标是其对角线。也就是说,需要排序或判断后,将小的值放在前面,再去运算。
3、第九行代码的意思是:若矩形1中x坐标最小值大于等于矩形2中x坐标最大值 或 矩形1中x坐标最大值小于等于矩形2中x坐标最小值…
代码:
#include<bits/stdc++.h>
using namespace std;
double x[4], y[4];
int main() {
for(int i = 0; i < 4; i += 2)
cin >> x[i] >> y[i] >> x[i+1] >> y[i+ 1];
sort(x, x+2); sort(x+2, x+4);
sort(y, y+2); sort(y+2, y+4);
if(x[0] >= x[3] || x[1] <= x[2] || y[0] >= y[3] || y[1] <= y[2]){
printf("0.00\n");
}else{
sort(x, x+4); sort(y, y+4);
printf("%.2lf\n", (x[2] - x[1]) * (y[2] - y[1]) );
}
return 0;
}
日拱一卒,功不唐捐。
上一篇: rpm 博客分类: 命令及软件